Haskell isPalindrome 的单子

Haskell monad for isPalindrome

关于 wiki.haskell.org 的 99 Haskell 个问题中的第 6 个提出了一种测试列表([a] 类型的东西)是否为回文的单子方法:

isPalindromeM :: (Eq a) => [a] -> Bool
isPalindromeM = reverse >>= (==)

(这里reverse :: [c] -> [c]接受一个列表并以倒序输出一个列表)。

bind 操作暗示 monad 在这里发挥作用,但这个 monad 是什么?

由于isPalindrome涉及列表,我的第一个猜测是monad与List one有关,但我不知道如何绘制连接。

我花了一些时间才找到 monad,因为它与 List 无关,我想我会 post 一个答案。

表达式 reverse >>= (==) 暗示 reverse 的类型是 m a,对于某些单子 m,因此 m a 是类型 [c] -> [c].我们还需要 isPalindromeM 具有类型 [c] -> Bool,并且绑定表达式暗示 m b[c] -> Bool 相同。最后,此上下文要求 (==) :: [c] -> [c] -> Bool 具有 a -> m b.

类型

因此我们推断 a[c] 并且 bBool,并且 monad m 采用类型 a 并发送它到函数类型 [c] -> a。这表明正在发挥作用的 monad 是 Monad ((->) [c])defined here

如果这个故事有一些寓意的话,也许是“你可以用任何东西制作一个单子”。