简单的任务:我想要的只是一个将参数列表应用于curried函数的函数。
假设我们的函数是着名的add
:
fun add a b = a + b;
现在我想要的是一个将列表(比如[1, 5]
)应用于add
的功能。这将是:
apply add [1, 5];
这似乎比我想象的要难。我的尝试:
fun apply f ps = foldl (fn (p, f') => f' p) f ps;
但这会得到这个搞笑的可读错误消息:
Error: operator and operand don't agree [circularity]
operator domain: 'Z * ('Z -> 'Y) -> 'Z -> 'Y
operand: 'Z * ('Z -> 'Y) -> 'Y
in expression:
foldl (fn (p,f') => f' p)
现在,我的实施有什么问题?在SML / NJ中甚至可能吗?
欢呼并感谢提示和答案。
答案 0 :(得分:4)
问题的根源在于,为了实现这一点,折叠函数的类型必须随着它在列表中折叠而改变,并且(希望显然)是不可能的。 / p>
"循环" (fn (p, f') => f' p)
中的f' p
类型必须与f'
的类型相同。
我个人的直觉是,您尝试的内容是不可能的,因为apply add []
,apply add [1]
和apply add [1,2]
必须有不同的类型。<登记/>
而apply add [1,2,3]
根本没有多大意义。
有用的练习可能是尝试记下apply
的类型。