Functional programming 将参数列表应用于当前函数

Functional programming 将参数列表应用于当前函数,functional-programming,sml,currying,Functional Programming,Sml,Currying,简单任务:我只需要一个函数,将参数列表应用于一个curried函数 假设我们的函数是著名的addone: fun add a b = a + b; 现在,我只需要一个函数,将列表(例如[1,5])应用于添加。这将看起来像: apply add [1, 5]; 这似乎比我想象的要难。我的尝试: fun apply f ps = foldl (fn (p, f') => f' p) f ps; 但这得到了一个有趣的可读错误信息: Error: operator and operand d

简单任务:我只需要一个函数,将参数列表应用于一个curried函数

假设我们的函数是著名的
add
one:

fun add a b = a + b;
现在,我只需要一个函数,将列表(例如
[1,5]
)应用于
添加
。这将看起来像:

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甚至可能吗


干杯并感谢您的提示和回答。

问题的根源在于,要使其正常工作,折叠函数的类型必须在列表中折叠时更改,而这(希望很明显)是不可能的

(fn(p,f')=>f'p)
中的“循环性”来自这样一个事实,即
f'p
的类型必须与
f'
的类型相同

我个人的直觉是,你所尝试的是不可能的,因为
apply add[]
apply add[1]
apply add[1,2]
必须有不同的类型。
而且,
apply add[1,2,3]
一点意义都没有


一个有用的练习可能是尝试写下
apply

的类型。问题的根源是,要使其工作,折叠函数的类型必须在列表中折叠时更改,而这(希望很明显)是不可能的

(fn(p,f')=>f'p)
中的“循环性”来自这样一个事实,即
f'p
的类型必须与
f'
的类型相同

我个人的直觉是,你所尝试的是不可能的,因为
apply add[]
apply add[1]
apply add[1,2]
必须有不同的类型。
而且,
apply add[1,2,3]
一点意义都没有


一个有用的练习可能是尝试写下
apply

的类型是的,我不知怎么地怀疑。不过,我真的认为一定有办法完成这项任务…@scheffield你的具体案例可以硬编码,但这不是很有用。我相信你可以用Idris这样的类型系统来解决一般问题,你需要将函数的算术性与列表的长度相匹配,我认为这或多或少需要一个图灵完整的类型系统。当然,我也可能是在发自肺腑地说话(双关语的意思)。是的,我不知怎么地怀疑这一点。不过,我真的认为一定有办法完成这项任务…@scheffield你的具体案例可以硬编码,但这不是很有用。我相信你可以用Idris这样的类型系统来解决一般问题,你需要将函数的算术性与列表的长度相匹配,我认为这或多或少需要一个图灵完整的类型系统。当然,我也可能是在胡说八道(双关语)。