2017-04-25 44 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'的参数,但这当然是另一种类型的错误。 –