【问题标题】:SML functions as valuesSML 函数作为值
【发布时间】:2020-07-05 11:10:08
【问题描述】:

我正在 SML 中对此进行试验

- val p = (fn (x,y) => x + y, fn (x,y) => x - y)
val p = (fn,fn) : (int * int -> int) * (int * int -> int)

但我一次只能评估一个

- #1(p)(3,2)
5

- #2(p)(3,2)
1

为什么我不能两者都做?

- (p)(3,2)
Error: operator is not a function [tycon mismatch]...

我需要什么准 lambda 演算形式让它返回一个 2 元组,第一个位置来自 x+y lambda 函数,第二个来自 x-y lambda 函数?乍一看,这就是它会做的事情。一般来说,我不知道这个例子中的变量和函数是什么。

【问题讨论】:

    标签: tuples sml lambda-calculus


    【解决方案1】:

    fn (x,y) => x + yfn (x,y) => x - y 是函数; p 是一对函数; #1 p#2 p 是函数;一对不是函数。

    如果你想要一个匿名函数(我假设这就是“准 lambda 演算形式”的意思),它看起来像这样

    fn (f, g) => fn x => (f x, g x)
    

    也就是说,首先获取一对函数,然后是某物,然后将这两个函数应用于某物。

    - (fn (f,g) => fn x => (f x, g x)) p (3,2);
    val it = (5,1) : int * int
    

    或者,如果您决定使用选择器而不是模式匹配:

    - (fn fns => fn x => (#1 fns x, #2 fns x)) p (3,2);
    val it = (5,1) : int * int
    

    【讨论】:

    • 这是柯里化吗?
    • 它没有,但为什么fn (f, g) => fn (x,y) => (f x, g x) 不起作用?
    • 因为x 的类型为int(它是(x, y) : int * int 的一个元素)并且fg 的域都是int * int
    • 如果你想绑定 x、y 以及元组,你可以这样做:fn (f, g) => fn (pair as (x, y)) => (f pair, g pair)
    【解决方案2】:

    我不确定你在问什么。一个函数就是一个函数,一对就是一对。一对函数不是函数,所以不能应用。

    但是,您可以一对函数转换为对对上的函数,方法是在对上定义一种映射函数形式,类似于列表中的映射:

    fun mapPair (f, g) (x, y) = (f x, g y)
    

    有了它,你可以这样做:

    mapPair (p) (2, 3)
    

    编辑:以上只是柯里化函数的简写,即返回函数的函数:

    fun mapPair (f, g) = fn (x, y) => (f x, g y)
    

    或等效:

    val mapPair = fn (f, g) => fn (x, y) => (f x, g y)
    

    【讨论】:

    • 这个mapPair 函数类似于Haskell 的Control.Arrow 库中的*** 运算符,具体化为元组。它也类似于Data.Bifunctorbifmap。我认为后者在 SML 中也是一个很好的抽象。
    • 对于这个初学者来说,(f, g)(x, y) 有两组独立的参数,mapPair 是新手。在应用程序中,我直觉p(f, g) 占用,(2, 3)(x, y) 占用。这真是太神奇了!您能否指出其他示例或对此的教程处理?正如我所提到的,这看起来类似于 lambda 演算及其归约,但我不确定如何。需要通过我的格雷格迈克尔森的书。那么这可以用 lambda 演算来写吗?
    • @147pm,没什么神奇的,只是柯里化函数的简写语法,即 lambda 返回一个 lambda。请参阅我的编辑。是的,ML 只不过是一种丰富的 lambda 演算。
    猜你喜欢
    • 1970-01-01
    • 2019-07-18
    • 1970-01-01
    • 2013-12-23
    • 2013-03-20
    • 2012-01-23
    • 1970-01-01
    • 2021-01-23
    • 2014-03-19
    相关资源
    最近更新 更多