gpt4 book ai didi

haskell - 编写应用程序

转载 作者:行者123 更新时间:2023-12-04 12:41:53 27 4
gpt4 key购买 nike

我正在阅读 haskellbook 的第 25 章(组合类型) , 并希望更全面地了解应用组合

作者提供了一个类型来体现类型组合:

newtype Compose f g a =
Compose { getCompose :: f (g a) }
deriving (Eq, Show)

并为此类型提供仿函数实例:

instance (Functor f, Functor g) =>
Functor (Compose f g) where
fmap f (Compose fga) =
Compose $ (fmap . fmap) f fga

但是 Applicative 实例留给读者作为练习:

instance (Applicative f, Applicative g) =>
Applicative (Compose f g) where
-- pure :: a -> Compose f g a
pure = Compose . pure . pure
-- (<*>) :: Compose f g (a -> b)
-- -> Compose f g a
-- -> Compose f g b
Compose fgf <*> Compose fgx = undefined

我可以作弊并在线查找答案... Data.Functor.Compose 的来源提供应用实例定义:

Compose f <*> Compose x = Compose ((<*>) <$> f <*> x)

但我无法理解这里发生的事情。根据类型签名,fx被包裹在两层应用结构中。我似乎遇到的障碍是理解这个位是怎么回事:(<*>) <$> f .我可能会有后续问题,但它们可能取决于该表达式的评估方式。是说“fmap <*> over f”还是“apply <$> to f”?

请帮助您直观地了解这里发生的事情。

谢谢! :)

最佳答案

考虑表达式 a <$> b <*> c .这意味着采用函数 a , 并将其映射到仿函数 b 上,这将产生一个新的仿函数,然后将该新的仿函数映射到仿函数 c 上。 .

首先,假设 a(\x y -> x + y) , bJust 3 , 和 cJust 5 . a <$> b然后评估为 Just (\y -> 3 + y) , 和 a <$> b <*> c然后评估为 Just 8 .

(如果前面的内容没有意义,那么在尝试理解多层应用程序之前,您应该尝试进一步理解单层应用程序。)

同样,在您的情况下,a(<*>) , bf , 和 cx .如果您要为 f 选择合适的值和 x ,你会发现它们也可以很容易地被评估(尽管一定要保持你的层不同;你的 (<*>) 属于内部应用程序,而 <$><*> 属于外部应用程序).

关于haskell - 编写应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58054217/

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