当前位置:  开发笔记 > 编程语言 > 正文

无法理解序列的类型[Just,Just]

如何解决《无法理解序列的类型[Just,Just]》经验,为你挑选了1个好方法。

我很困惑为什么我在GHCi中得到这个

:t sequence [Just,Just]
sequence [Just, Just] :: a -> [Maybe a]

详细说明,我可以理解,sequence [Just 1, Just 2] :: Num a => Maybe [a]因为在查看序列的类型时

sequence :: (Monad m, Traversable t) => t (m a) -> m (t a)

很明显,此函数采用monadic值的集合并返回集合的单个monadic值.因此,当我们打电话sequence [Just 1, Just 2],我们应该取回Just[1,2].接下来那个想法,不应该sequence [Just, Just]单回Just

谢谢.



1> chi..:

第二个sequence在另一个monad中工作.

为了第一:

sequence [Just 1, Just 2]

我们有这个Just 1 :: Maybe a,这是Maybemonad中的一个值.具体而言,该类型[Maybe a]是针对匹配t (m b)所要求的顺序,我们得到t ~ [],m ~ Maybe,b ~ a-因此Maybe单子.

对于第二个:

sequence [Just, Just]

我们有Just :: a -> Maybe a.这是哪个monad?现在的类型[a -> Maybe a]是针对匹配t (m b),我们得到t ~ [],m ~ (->) a,b ~ Maybe a-因此我们现在在工作的(->) a单子,而不再是Maybe一个.

在这个与(->) amonad同构的Reader amonad中,我们有例如

sequence [f, g, h] = \x -> [f x, g x, h x]

实际上,使用(->) amonad的计算是"读取类型的隐式参数"的计算a.的sequence功能只是简单地将这样的计算(列表[(->) a b],即,[a -> b])成一个单一的计算,读取隐含参数只是一次,并产生与所有的结果(列表(->) a [b],即,a -> [b]).

推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有