Functional programming 将参数列表应用于当前函数
简单任务:我只需要一个函数,将参数列表应用于一个curried函数 假设我们的函数是著名的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
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这样的类型系统来解决一般问题,你需要将函数的算术性与列表的长度相匹配,我认为这或多或少需要一个图灵完整的类型系统。当然,我也可能是在胡说八道(双关语)。