【问题标题】:How to declare an argument as a function in SML?如何在 SML 中将参数声明为函数?
【发布时间】:2017-11-20 19:30:55
【问题描述】:

我的问题是这样的: 如何定义一个函数,它在不使用类型约束的情况下接收函数,或者换句话说,无需键入 fun f1(f2:type->type) ? 我试图想出一种使用参数 f2 作为函数但它没有得到任何地方的方法。 有什么想法吗?

【问题讨论】:

    标签: sml smlnj


    【解决方案1】:

    你可以用一个函数做的一件事是你不能用任何其他值做的,那就是调用它。所以使用f2 作为函数意味着调用它——也就是说,将它应用到一个参数上。

    例如,您可以将f1 定义为:

    fun f1 f2 = f2 42
    

    f1 的推断类型将是(int -> 'a) -> 'a(使f2 的类型int -> 'a)。

    【讨论】:

    • 谢谢!但是我正在寻找一种解决方案,其中包括多态函数而不必使用任何特定数字
    • @Basilm 这是一个例子。你可以用任何你想要的参数来调用它。
    • 我理解,但在您的示例中,您使用了一个数字参数,不必将其作为参数接收。我是 SML 的初学者,但如果我想要一个多态函数,它不会强迫我接收一个额外的参数 (a) 以便我可以做 f2 a 吗?
    • @Basilm 是的,定义 ('a -> 'b) -> 'b 类型的函数(这似乎是您现在所要求的)或任何类似函数的唯一方法将涉及异常或无限递归。跨度>
    【解决方案2】:

    通过返回一个匿名函数,您可以这样做,结果函数可以接受任意函数作为输入(虽然不是很有用):

    fun id f = fn x => f x
    

    这使得id 成为一个高阶函数,它返回未修改的输入函数。 id 的类型是fn : ('a -> 'b) -> 'a -> 'b

    作为它“使用”的一个例子:

    - fun f x = x*x;
    val f = fn : int -> int
    - val g = id f;
    val g = fn : int -> int
    - g 5;
    val it = 25 : int
    

    一个更有趣的例子,它只适用于'a -> 'a类型的函数:

     fun self_compose f = fn x => f (f x)
    

    【讨论】:

    • 非常感谢!我设法编写了我正在寻找的东西,但我仍然不明白,你提到的格式是一个函数接收一个函数并返回另一个函数,但是如果我想要一个接收函数的函数:a->b 并返回接收函数的函数:a->b 并返回 b?换句话说,函数类型是:('a->'b)->('a->'b)->'b
    • 我不明白这怎么可能。 'a -> 'b 类型的函数是一种获取 'a 类型的值并将其映射到 'b 类型的值的方法。因此,要获得第二种类型的值,您需要第一种类型的值。您似乎想找到一种直接从函数本身获取第二种类型值的方法,而无需任何实际输入。这真的没有意义。
    • 不知道它是否改变了任何东西,但我正在寻找的确切类型是:('a->'b)->('a * 'b ->'b)-> 'b
    • 我完全明白你在说什么,如果没有输入 type : 'a->'b 的功能,我就无法接收到 type 'b 的结果,这是我的问题。但是,无论函数本身做什么,我都被要求这样做,只要它的类型是我提到的那个。 (我仔细检查了)
    • 我设法解决了,这个命令是:fun h a = fn b => fn g => g(a,g(a,b));
    猜你喜欢
    • 1970-01-01
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    • 1970-01-01
    • 2019-02-26
    相关资源
    最近更新 更多