2015-10-06 46 views
0
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”?关于翻转功能的困惑

回答

3

无论何时看到部分应用程序,您都可以使用eta(η)扩展以使事情更加明确。埃塔规则说,如果f任何功能,

f = \x -> f x 

如果在GHCI提示符下键入

:t flip charIn "abcdefghijklmnopqrstuvwxyz" 

,你会得到一个其中有一个箭头(->),意思是结果这是一个功能。所以

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

现在,您可以申请flip得到

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

这也许是更加明确的书面

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

,甚至,利用运营商部分的符号,

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

这是现在更清楚了。但我确实有一个问题。我把你的评价翻译在声明中,但不工作 - 所有$ charIn x ['a'..'z']。它只在我将其更改为 - all(charIn x)“abcdefghijklmnopqrstuvwxyz” – user124659

+0

@ user124659时才起作用,您似乎错过了'charIn x ['a'..'z']'之前的'\ x - >'。 – dfeuer

+0

哎呀我错过了那部分,但仍然isWord1 x =所有$ \ x - > charIn x ['a'..'z']给我“没有实例(显示(t10字符 - >布尔))”错误。 – user124659

2

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

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

0

flip把你作为参数传递的功能和给你回一个函数,以相反的顺序参数,什么可能混淆你是isWord的pointfree定义和你局部翻转的功能,适用于一个其论据。

你开始charIn所以现在翻转其观点是String -> Char -> Bool,那么你将它应用到String说法"abc...",并取回Char -> Bool。然后再做一个部分应用:all从元素到Bool和一个元素列表,其中Char -> BoolString又叫[Char]。因此,从(Char -> Bool) -> String -> Bool(在此上下文中为all的类型)中,可以通过传递第一个参数来获得结果String -> Bool。您也可以考虑['a'..'z']而不是"abc...z"

0

如果函数f带有两个参数x和y,即f x y。如果您需要修复y并将x设置为自由变量,则可以使用翻页将其写为flip f y x,并通过删除x flip f y将其转换为部分应用的表单。应用于x时,将评估f x y