将参数列表应用于柯里化函数
Apply a list of parameters to a curried function
简单的任务:我想要的只是一个将参数列表应用于柯里化函数的函数。
假设我们的函数是著名的 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 有可能吗?
干杯并感谢提示和答案。
问题的根源在于,要使其正常工作,折叠函数的类型必须在折叠列表时发生变化,而这(希望很明显)是不可能的。
(fn (p, f') => f' p)
中的"circularity"是因为f' p
的类型必须和f'
的类型相同。
我个人的直觉是你的尝试是不可能的,因为 apply add []
、apply add [1]
和 apply add [1,2]
必须有不同的类型。
而且 apply add [1,2,3]
根本没有多大意义。
一个有用的练习可能是尝试写下 apply
.
的类型
简单的任务:我想要的只是一个将参数列表应用于柯里化函数的函数。
假设我们的函数是著名的 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 有可能吗?
干杯并感谢提示和答案。
问题的根源在于,要使其正常工作,折叠函数的类型必须在折叠列表时发生变化,而这(希望很明显)是不可能的。
(fn (p, f') => f' p)
中的"circularity"是因为f' p
的类型必须和f'
的类型相同。
我个人的直觉是你的尝试是不可能的,因为 apply add []
、apply add [1]
和 apply add [1,2]
必须有不同的类型。
而且 apply add [1,2,3]
根本没有多大意义。
一个有用的练习可能是尝试写下 apply
.