Haskell 如何解读哈斯克尔';s'ap zip tail'表示“\x->;拉链x(尾巴x)`?
讨论了如何将Haskell表达式的类型Haskell 如何解读哈斯克尔';s'ap zip tail'表示“\x->;拉链x(尾巴x)`?,haskell,Haskell,讨论了如何将Haskell表达式的类型ap-zip-tail转换为\x->zip-x(tail x)。这是很有启发性的,但问题和答案都没有涉及为什么前一个表达式给出与后一个表达式相同的结果,只是它们的类型是等价的。据我所知,它可能意味着\x->zip x(tail(tail x)) 我试着读了好几年的文档,但没有结果。如何阅读ap来理解ap-zip-tail给出的结果与\x->zip-x(tail x)的结果相同?首先,也看一下: ()zip tail x=zip x(tail x)我们可以将x
ap-zip-tail
转换为\x->zip-x(tail x)
。这是很有启发性的,但问题和答案都没有涉及为什么前一个表达式给出与后一个表达式相同的结果,只是它们的类型是等价的。据我所知,它可能意味着\x->zip x(tail(tail x))
我试着读了好几年的文档,但没有结果。如何阅读ap
来理解ap-zip-tail
给出的结果与\x->zip-x(tail x)
的结果相同?首先,也看一下:
()zip tail x=zip x(tail x)
我们可以将x
移到右边,得到zip tail=\x->zip x(tail x)
您也可以直接使用ap
和实例Monad(->)a
的定义,而无需查看
,但这需要更多的努力
据我所知,这可能意味着\x->zip x(tail(tail x))
仅仅从类型来看,这实际上是不可能的:
m(a->b)->ma->mb
是(c->(a->b))->(c->a)->(c->b)
,因此apf1 f2
不能应用f2
两次:它有类型c->a
,并且f2(f2)
不会进行类型检查。第二部分解释它。请记住,
与ap
相同,但只是作为中缀运算符,并且作为Applicative
的一部分,而不是它的子类,Monad
,因为它只需要Applicative
就可以工作。如果你想知道如何找到自己:首先搜索它:你看到你最有可能使用monad实例,那么看看monad
:看看你是否能在下面找到正确的实例(这里是monad((->)r)
)-希望有一个到源代码的链接()和瞧(同时查看ap
:)的源代码)
ap m1 m2 = do { x1 <- m1; x2 <- m2; return (x1 x2) }
-- Since many Applicative instances define (<*>) = ap, we
-- cannot define ap = (<*>)
instance Applicative ((->) a) where
pure = const
(<*>) f g x = f x (g x)