我如何以无点样式重写这个回文验证器?

use*_*456 5 haskell pointfree

我有这段代码:

palindrome :: String -> Bool
palindrome x = x == reverse x
Run Code Online (Sandbox Code Playgroud)

有没有办法以无点的方式重写这个?

Dav*_*vid 8

是的,因为任何函数都可以用无点样式编写.这里,(->) 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情况下有用.

  • "这可能不如原始表达式可读,因此不应该使用"是一个有趣的评论.有些Python人认为`map`总是比列表理解更不易读.什么是可读的真正取决于成语是什么流行.过去常常看到应用风格的人可能会将无点版本看作"身份平等和颠倒"或其他东西,这很容易理解.流行的成语随着时间的推移而发生变化,所以如果你想让它改变一个特定的方向,你可以通过谨慎地使用"怪异的"来帮助它们. (5认同)

Ste*_*ehl 1

是的。

palindrome :: String -> Bool
palindrome = ap (==) reverse
Run Code Online (Sandbox Code Playgroud)