簡體   English   中英

我如何以無點樣式重寫這個回文驗證器?

[英]How would I rewrite this palindrome verifier in point-free style?

我有這段代碼:

palindrome :: String -> Bool
palindrome x = x == reverse x

有沒有辦法以無點的方式重寫這個?

是的,因為任何函數都可以用無點樣式編寫。 這里, (->) r (又名讀者)的Applicative實例為你做了這個,因為

(f <*> g) x = f x (g x)

您可能會將此識別為SKI演算中的S組合子(順便說一下, return K)。

你的Palindrome檢查器寫成

x == reverse x

以中綴形式讀取

(==) x (reverse x)

並且通過與上面的<*>定義進行比較,這導致表達式

isPalindrome x = ((==) <*> reverse) x

您可以在哪里刪除尾隨x以獲得解決方案

isPalindrome = (==) <*> reverse

這可能不如原始表達式可讀,因此不應該使用。 無點樣式是為了便於閱讀,僅在certian情況下有用。

你可能認為這種方法是作弊的:

palindrome :: Eq a => [a] -> Bool
palindrome = palindrome'
  where palindrome' xs = xs == reverse xs

當然,大衛和弗雷爾也提出了適用的風格:

palindrome'' :: Eq a => [a] -> Bool
palindrome'' = (==) <*> reverse

但這個表達怎么樣呢?

palindrome''' :: Eq a => [a] -> Bool
palindrome''' = (foldl (\b (x, y) -> b && x == y) True)
              . (uncurry zip)
              . reverse'
  where reverse' xs = (xs, reverse xs)

(->) r也是一個Monad,所以你的回文檢查器可以用monadic bind編寫,這可能比上面的Applicative解決方案更具可讀性

palindrome :: String -> Bool
palindrome = reverse >>= (==)

是。

palindrome :: String -> Bool
palindrome = ap (==) reverse
 palindrome :: String -> Bool
 palindrome = uncurry (==) . (id &&& reverse)

(&&&)Control.Arrow中定義,以便(f &&& g) x = (fx, gx)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM