我有这段代码:
palindrome :: String -> Bool
palindrome x = x == reverse x
Run Code Online (Sandbox Code Playgroud)
有没有办法以无点的方式重写这个?
是的,因为任何函数都可以用无点样式编写.这里,(->) r(又名读者)的Applicative实例为你做了这个,因为
(f <*> g) x = f x (g x)
Run Code Online (Sandbox Code Playgroud)
您可能会认识到这是SKI演算中的S组合子(return顺便说一下是K).
你的Palindrome检查器写成
x == reverse x
Run Code Online (Sandbox Code Playgroud)
以中缀形式读取
(==) x (reverse x)
Run Code Online (Sandbox Code Playgroud)
并且通过与<*>上面的定义进行比较,这导致了表达
isPalindrome x = ((==) <*> reverse) x
Run Code Online (Sandbox Code Playgroud)
您可以在哪里删除尾随x以获得解决方案
isPalindrome = (==) <*> reverse
Run Code Online (Sandbox Code Playgroud)
这可能不如原始表达式可读,因此不应该使用.无点样式是为了便于阅读,仅在certian情况下有用.
是的。
palindrome :: String -> Bool
palindrome = ap (==) reverse
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |