wiki.haskell.org上的 99 個 Haskell 問題中的第 6 個提出了一種測驗串列(型別的東西[a])是否是回文的一元方法:
isPalindromeM :: (Eq a) => [a] -> Bool
isPalindromeM = reverse >>= (==)
(這里reverse :: [c] -> [c]需要一個串列并按倒序輸出一個串列)。
bind 操作意味著這里有一個 monad,但是這個 monad 是什么?
由于 isPalindrome 涉及串列,我的第一個猜測是 monad 與 List 相關,但我不知道如何繪制連接。
uj5u.com熱心網友回復:
我花了一些時間才找到 monad,由于它與 無關List,我想我會發布一個答案。
該運算式reverse >>= (==)暗示reverseis的型別m a,對于某些 monad m,因此m ais 型別[c] -> [c]。我們還需要isPalindromeMtype [c] -> Bool,并且系結運算式暗示m b與[c] -> Bool. 最后,此背景關系需要(==) :: [c] -> [c] -> Bool具有型別a -> m b。
因此我們推匯出ais[c]和bis Bool,monadm接受一個型別a并將它發送到函式 type [c] -> a。這表明在起作用的 monad 是Monad ((->) [c]). 在這里定義
如果這個故事有一些寓意,也許是“你可以用任何東西制作一個單子”。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359166.html
上一篇:從鏡頭串列創建遍歷
