【问题标题】:Is the SML `o` operator only useful on single-argument functions?SML `o` 运算符是否仅对单参数函数有用?
【发布时间】:2013-01-19 09:04:03
【问题描述】:

o 组合运算符(例如val x = foo o bar,其中foobar 都是函数)是否仅可用于单参数函数和/或具有相同数量参数的函数?如果不是,那么将foo(x,y)bar(x) 组合在一起的语法是什么。

【问题讨论】:

    标签: sml smlnj ml


    【解决方案1】:

    我见过一些标准 ML 代码(尤其是 Poly/ML 代码 Isabelle/Pure),它们将额外的组合运算符放入处理这种情况的顶级环境中。例如:

    fun (f oo g) x y = f (g x y)
    fun (f ooo g) x y z = f (g x y z)
    fun (f oooo g) x y z w = f (g x y z w)
    

    一般来说,应该谨慎使用这些东西(四个或更多 o 有点傻),但至少有 oo 是非常有用的。

    【讨论】:

      【解决方案2】:

      正如 Michael 已经说过的,是的,SML 只有单参数函数。不过我想详细说明一下。

      如下函数:

      fun foo (x,y) = x + y
      

      有类型:

      fn : int * int -> int
      

      这意味着第一个参数是两个整数的元组。所以你可以这样做:

      (sign o foo) (4,~5)
      

      这会给你和sign (foo (4,~5))一样的东西。

      好的,但是这样的事情呢?

      fun bar x y = x + y
      

      它的类型:

      fn : int -> int -> int
      

      这意味着 bar 实际上只接受一个整数,并返回一个函数。所以你不能这样做:

      (sign o bar) 4 ~5
      

      因为 bar 返回一个函数,而 sign 需要一个整数。不过,您可以这样做:

      (sign o bar 4) ~5
      

      因为bar 4 是一个将数字加 4 的函数。

      【讨论】:

      • 非常有帮助。非常感谢!
      • 如果您定义了一个uncurry 函数来帮助解决您使用sign o bar 的最后一个“问题”,还可能还有一个flip 函数可以通过翻转@987654333 对来翻转“参数排序” @到(y,x)
      • Jesper:在这种情况下,我可能会定义一个 $ 运算符并执行sign $ bar x y
      【解决方案3】:

      SML 只有单参数函数; foo(x,y) 是一个函数 foo 采用单个参数,元组 (x, y)。因此,不需要特殊处理,bar(x) 将需要返回一个适当类型的元组来与foo 组合它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-18
        • 1970-01-01
        • 2021-11-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-08-20
        • 2015-09-21
        相关资源
        最近更新 更多