2017-04-25 16 views
0
f::Char->String->String 
f ch str 
    |('a'<=ch&&ch<='z')=ch:str 
    |otherwise=str 

輸出瞭解高階函數似乎真的反直覺對我說:在Haskell

*Main> foldr f "END" "xYz1Ab" 
"xzbEND" 
*Main> foldr f "xYz1Ab" "END" 
"xYz1Ab" 

我的思緒列車是「結束」是CH和「xYz1Ab」是海峽,所以foldr f "END" "xYz1Ab"是應該是「ENDxzb」,並且foldr f "xYz1Ab" "END"被假定爲「END」。誰可以給我解釋一下這個?

回答

1

"END"中的字符都不匹配後衛('a'<=ch&&ch<='z'),所以它們不會被追加。

foldr的第二個參數是初始狀態,它始終以str傳遞,而不是ch

+0

但聲明是f ch str,輸入是f「END」「xYz1Ab」,不應該對應於「END」,str是「xYz1Ab」? – user3358850

+1

但是你沒有寫'f「END」「xYz1Ab」',你寫了'foldr f「END」「xYz1Ab」'。在第一種情況下,這兩個字符串是'f'函數的參數(不考慮'f'的第一個參數應該是一個'Char',而不是'String')。在第二種情況下,'f',''END「'和'」xYz1Ab「'都是'foldr'函數的參數。如果你寫了'foldr(f「END」「xYz1Ab」)',那麼這些字符串就是'f'的參數,但這當然是另一種類型的錯誤。 –