【问题标题】:Apply a list of parameters to a curried function将参数列表应用于柯里化函数
【发布时间】:2015-07-29 01:11:35
【问题描述】:

简单的任务:我想要的只是一个将参数列表应用于柯里化函数的函数。

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

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

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

【问题讨论】:

    标签: functional-programming sml currying


    【解决方案1】:

    问题的根源在于,要使其正常工作,折叠函数的类型必须在它通过列表折叠时发生变化,而这(希望很明显)是不可能的。

    (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 之类的类型系统解决一般问题 - 您需要将函数的数量与列表的长度相匹配,我 认为 或多或少需要图灵完备的类型系统。当然,我也可能是在说我的底线(双关语)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-05
    • 2011-04-22
    • 2016-01-01
    • 1970-01-01
    • 2014-11-27
    • 2021-02-07
    • 2012-10-06
    相关资源
    最近更新 更多