我有一个理论问题,我和一个 friend 一直在试图了解我们如何才能做到这一点。我们有一个名为palindrome
的函数,它告诉我们一个字符串是否是回文。以下是我们的实现方式(可能有更好的方法,但这就是我们更喜欢的方式。)
palindrome :: String -> Bool
palindrome = \x -> (== reverse x) x
我们想要做的是删除
我们在这里使用的 Lambda,只使用部分应用程序和高阶函数。我们对如何做到这一点有几种想法,但没有一个与我们创建的函数类型相匹配:
palindrome :: String -> Bool
最接近的方法之一是使用组合,但它返回一个函数,该函数需要两个字符串而不是一个,因为一个用于反向,另一个用于 (==):
palindrome = (==) . reverse
也许,我们忘记了一些事情或者我们没有看到一些事情。如果不使用 Lambda 来使用这两个函数,你会如何做?
最佳答案
您可以使用<*>
(->)
的运算符Applicative
的实例.
palindrome = (==) <*> reverse
<*>
运算符在某些情况下有点像函数应用程序。在本例中,该上下文是“以 String
作为参数的函数”。所以你得到一个需要 String
的函数并将其传递给两个也采用 String
的函数s,然后将前者的结果应用于后者。换句话说,f <*> g = \x -> f x (g x)
.
关于 haskell + "Remove a parameter",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26799101/