假设
f x y z = x*y*z
Run Code Online (Sandbox Code Playgroud)
然后我希望与列表的每个成员一起返回f的三次应用程序
foldl ($) f [1,2,3]
Run Code Online (Sandbox Code Playgroud)
就像是 (((f 1) 2) 3) = 1*2*3 = 6
函数f将是累加器,并且折叠的每次迭代将应用一个参数并返回部分应用的函数作为下一个累加器.
为什么这不起作用?是因为f迭代时改变了类型吗?
旁白:有没有其他方法可以完成这种类型的功能应用程序?
类型看起来像
foldl :: (a -> b -> a) -> a -> [b] -> a
($) :: (x -> y) -> x -> y
Run Code Online (Sandbox Code Playgroud)
适用foldl于($)需要匹配(技术上,统一)的第一个参数的类型foldl与类型($).也就是说,求解方程式
a -> b -> a = (x -> y) -> x -> y
Run Code Online (Sandbox Code Playgroud)
这导致立即
a = x -> y
b = x
a = y
Run Code Online (Sandbox Code Playgroud)
将第二个和第三个方程式代入第一个方程式:
a = b -> a
Run Code Online (Sandbox Code Playgroud)
问题是Haskell 没有解决这个等式的类型.特别是,不可能用有限数量的符号写下解决方案!它首先扩展到
a = b -> b -> a
Run Code Online (Sandbox Code Playgroud)
然后
a = b -> b -> b -> a
Run Code Online (Sandbox Code Playgroud)
永远.所以没有办法为类型变量选择类型以使它们匹配,GHC会大声抱怨.