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]
并且 b
是 Bool
,并且 monad m
采用类型 a
并发送它到函数类型 [c] -> a
。这表明正在发挥作用的 monad 是 Monad ((->) [c])
。 defined here
如果这个故事有一些寓意的话,也许是“你可以用任何东西制作一个单子”。
关于 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]
并且 b
是 Bool
,并且 monad m
采用类型 a
并发送它到函数类型 [c] -> a
。这表明正在发挥作用的 monad 是 Monad ((->) [c])
。 defined here
如果这个故事有一些寓意的话,也许是“你可以用任何东西制作一个单子”。