这是哈斯克尔代码:
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 的幕后是否发生了一些导致必要的类型转换的事情?
该代码有效,不是我自己的作品,我只是想了解它是如何被允许的。