Re[2]: Все-таки заплатил $24 за GPT4...
От: Shmj Ниоткуда  
Дата: 16.09.23 07:15
Оценка: 1 (1)
Здравствуйте, Нomunculus, Вы писали:

Н>А какой первый вопрос ты ему задал? Видимо за ответ на него ты выложил $24?


Да, так и было — уже отбил 24. Все время откладывал, но хотел разобраться в сути Монад в Haskell. И у меня свой способ разбирательства — на мин. примерах. Вот такой код получился как бы с нуля:

{-# LANGUAGE FlexibleInstances #-}

-- Maybe2
data Maybe2 a = Nothing2 | Just2 a

-- Определение класса Functor2
-- (a -> b): Это функция, преобразующая значения типа a в значения типа b.
-- f a: Это контейнер (или структура данных) типа f, содержащий элементы типа a. Например, это может быть Maybe a или [a] (список элементов типа a).
-- f b: Это такой же контейнер типа f, но содержащий элементы типа b.
class Functor2 f where
    fmap2 :: (a -> b) -> f a -> f b

-- Экземпляр Functor2 для Maybe
instance Functor2 Maybe2 where
    fmap2 _ Nothing2  = Nothing2
    fmap2 fun1 (Just2 val1) = Just2 (fun1 val1)

class Functor2 f => Applicative2 f where
    pure2 :: a -> f a
    (<**>) :: f (a -> b) -> f a -> f b

instance Applicative2 Maybe2 where
    pure2 = Just2
    Nothing2 <**> _ = Nothing2
    _ <**> Nothing2 = Nothing2
    Just2 f <**> Just2 x = Just2 (f x)

class Applicative2 m => Monad2 m where
    return2 :: a -> m a
    (<<>>==) :: m a -> (a -> m b) -> m b

instance Monad2 Maybe2 where
    return2 :: a -> Maybe2 a
    return2 = Just2
    Nothing2 <<>>== _ = Nothing2
    Just2 x <<>>== f = f x

safeSqrt :: Double -> Maybe2 Double
safeSqrt x
    | x < 0     = Nothing2
    | otherwise = Just2 (sqrt x)

-- Для печати на экране
instance (Show a) => Show (Maybe2 a) where
    show Nothing2 = "Nothing2"
    show (Just2 x) = "Just2 " ++ show x ++ "."

main :: IO ()
main = do
    let val = Just2 256
    let result = val <<>>== safeSqrt <<>>== safeSqrt <<>>== safeSqrt
    print result


Обычная версия выдавала не рабочий код — а эта выдает 100% рабочий код.

Потом каждый фрагмент кода объясняет детально до запятой...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.