小编Ed *_*Lim的帖子

为什么允许在带有两个 monad 值的函数上使用 `ap`,而不是在 monad 中包装的函数上使用?

这是哈斯克尔代码:

zipWith compare `ap` tail
Run Code Online (Sandbox Code Playgroud)

在哪里

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
compare :: a -> a -> Ordering 
ap :: Monad m => m (a -> b) -> m a -> m b
Run Code Online (Sandbox Code Playgroud)

因此,根据我的理解,ap在这种情况下将需要一个包装在列表单子内的函数,即它的 need m (a -> b),这应该是由zipWith compare但我不知道如何实现的,因为zipWith compare将采用[a] -> [a] -> [Ordering]不太正确的类型。列表 monad 的幕后是否发生了一些导致必要的类型转换的事情?

该代码有效,不是我自己的作品,我只是想了解它是如何被允许的。

monads haskell

4
推荐指数
1
解决办法
86
查看次数

标签 统计

haskell ×1

monads ×1