2015-10-06 48 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