将参数列表应用于curried函数

时间:2015-05-17 14:23:57

标签: functional-programming sml currying

简单的任务:我想要的只是一个将参数列表应用于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中甚至可能吗?

欢呼并感谢提示和答案。

1 个答案:

答案 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的类型。