混淆翻转功能

时间:2015-10-06 21:43:39

标签: haskell

charIn ::  Char -> String -> Bool
charIn _ []       = False
charIn x (y:ys)   = x==y || charIn x ys

isWord :: String -> Bool
isWord = all $ flip charIn "abcdefghijklmnopqrstuvwxyz"

-- isword "abc" (Result True)
-- isWord "ab1" (Result False)

我对翻转功能的工作方式感到困惑。我知道它会翻转前两个参数,但它在上面的代码中是如何工作的?它是否只是翻转字符串参数和 charIn" abcdefghijklmnopqrstuvwxyz" 以便它看起来像 - 所有$ charIn" abcdefghijklmnopqrstuvwxyz"?

4 个答案:

答案 0 :(得分:3)

每当您看到部分应用程序时,您都可以使用 eta(η)扩展来使事情更加明确。 eta规则说如果f是任何函数,

f = \x -> f x

如果您输入

:t flip charIn "abcdefghijklmnopqrstuvwxyz"

在GHCi提示符下,你会得到一个箭头(->)的结果,这意味着它是一个函数。所以

flip charIn ['a' .. 'z']
=
\x -> flip charIn ['a' .. 'z'] x

现在您可以应用flip来获取

=
\x -> charIn x ['a' .. 'z']

或许写得更清楚

\x -> x `charIn` ['a' .. 'z']

或甚至使用操作符部分表示法

(`charIn` ['a' .. 'z'])

答案 1 :(得分:2)

flip charIn "abcdefghijklmnopqrstuvwxyz"与lambda \c -> charIn c "abcdefghijklmnopqrstuvwxyz"相同。

flip charIn部分应用于字符串;剩下的是一个期待一个论点的函数。

答案 2 :(得分:0)

flip将您传递的函数作为参数,返回一个以相反顺序获取参数的函数,可能令您困惑的是{{1}的无点定义并且您将翻转函数部分应用于其中一个参数。

您从isWord开始并翻转其参数,现在它是charIn,然后您将其应用于String -> Char -> Bool参数String并返回"abc..."。然后再做一个部分应用:Char -> Bool从元素到all获取一个函数,以及一个元素列表,BoolChar -> Bool又称String。因此,从[Char](此上下文中的(Char -> Bool) -> String -> Bool的类型),您可以通过传递第一个参数来获得结果all

另外,您可能需要考虑String -> Bool而不是['a'..'z']

答案 3 :(得分:0)

如果你的函数f有两个参数x和y,那就是seven。如果你需要修复y并将x作为自由变量,你可以使用flip将其写为*ppp = pp *pp = p *p = seven = 7 并通过删除x f x y转换为部分应用的形式。应用于x时,将评估flip f y x