【发布时间】:2021-12-24 10:18:59
【问题描述】:
wiki.haskell.org 上的 99 个 Haskell 问题中的第 6 个提出了一种测试列表([a] 类型)是否为回文的单子方法:
isPalindromeM :: (Eq a) => [a] -> Bool
isPalindromeM = reverse >>= (==)
(这里reverse :: [c] -> [c] 接受一个列表并按倒序输出一个列表)。
绑定操作意味着这里有一个 monad,但是这个 monad 是什么?
由于 isPalindrome 涉及列表,我的第一个猜测是 monad 与 List 相关,但我不知道如何绘制连接。
【问题讨论】:
-
Functions have an applicative/monad instance。但我认为没有理由在应用程序上使用 monad 实例(除了删除
flip)。所以我想问问作者,为什么不isPalindromA = (==) <*> reverse? -
@Micha 我完全同意,尤其是因为我发现应用形式更加透明。我的问题更多地针对“为什么这种单子表达式有效?”