gpt4 book ai didi

haskell : Applicative Functor

转载 作者:行者123 更新时间:2023-12-05 00:26:39 26 4
gpt4 key购买 nike

我是 Haskell 的新手。我做了一个类型 Maybe3。

data Maybe3 a= Just3 a| Unknown3 | Missing3 deriving (Show, Eq, Ord)
eq3 :: Eq a => Maybe3 a-> Maybe3 a-> Bool3
eq3 Unknown3 _ = Unk3
eq3 Missing3 _ = False3
eq3 _ Missing3 = False3
eq3 _ Unknown3 = Unk3
eq3 (Just3 a) (Just3 b)=if a==b then True3 else False3

如何使 Maybe3 成为应用仿函数?以及如何使其成为 Monad?

最佳答案

核心思想

我的理解是 Missing3Unknown3 的工作方式有点像 Nothing,除了它们会给出更多关于为什么没有答案的反馈,所以彼此之间的行为可能略有不同。当然,我认为 Missing3 应该表现得像 Nothing

让我们看看这些是如何为 Maybe 定义的:

仿函数

这是 Maybe 的 Functor 实例:

instance  Functor Maybe  where
fmap _ Nothing = Nothing
fmap f (Just a) = Just (f a)

我想这里应该很清楚如何处理Missing3Unknown3了。

单子(monad)

instance  Monad Maybe  where
(Just x) >>= k = k x
Nothing >>= _ = Nothing

(Just _) >> k = k
Nothing >> _ = Nothing

return = Just
fail _ = Nothing

对于 Missing3Unknown3,您不得不对 >>= 执行相同的操作,因为您没有要绑定(bind)的值。唯一的问题是您是否因 Unknown3Missing3 而失败?

应用

这里有更多的挖掘:

instance Applicative Maybe where
pure = return
(<*>) = ap

ap :: (Monad m) => m (a -> b) -> m a -> m b
ap = liftM2 id

liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r
liftM2 f m1 m2 = do { x1 <- m1; x2 <- m2; return (f x1 x2) }

现在转化为

mf <*> mx = do
f <- mf
x <- mx
return (f x)

您可以一直使用它来将 Monad 变成应用程序。

旁白:Applicative 很棒。

事实上,每当你发现自己在写作时

this thing = do
something <- some monadic thing
more <- some other thing
yetmore <- another thing too
return (combine something more yetmore)

你应该使用应用符号重写它:

this thing = combine <$> some monadic thing 
<*> some other thing
<*> another thing too

关于 haskell : Applicative Functor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21840157/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com