Здравствуйте, Н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% рабочий код.
Потом каждый фрагмент кода объясняет детально до запятой...