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"?
答案 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
获取一个函数,以及一个元素列表,Bool
和Char -> 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
。