【发布时间】:2019-05-21 14:48:33
【问题描述】:
我从这个开始
type int_pair = int * int
然后有这些
fun sip1 ((i,j) : int_pair) = (j,i)
fun sip1a (ip : int_pair) = (#2 ip, #1 ip)
fun sip2 (ip : int*int) = (#2 ip, #1 ip)
fun sip3 (i : int, j : int) = (j,i)
这些结果
: val sip1 = fn : int_pair -> int * int
: val sip1a = fn : int_pair -> int * int
: val sip2 = fn : int * int -> int * int
: val sip3 = fn : int * int -> int * int
它们都有效。令我困惑的是如何将sip1 和sip1a 设置为采用单个int_pair 变量ip 或类似元组的(i,j)。由于类型同义词,它如何处理两者?我只是假设正文中的任何类型的(a,b) 在返回时都会默认输入int*int,而且,在sip1 的表达式(j,i) 中,它似乎不需要引用(#1... ) 的sip1a。乍一看比较奇特。 sip2 似乎直截了当。但是然后在sip3 中,它似乎只是两个ints 进入和int*int 类型的结果出来;但是函数类型说它是int * int -> int * int。为什么不像我在其他语言中看到的那样键入int -> int -> int*int? IOW,为什么 ML 将多个传入变量视为一个元组?
【问题讨论】:
-
参数
(i, j)不是“类元组”,它是一个元组。所有函数都只接受一个参数。 -
另见
fun sip4 ((i,j) : int * int)、fun sip5 ((i : int, j : int) : int*int)和fun sip6 ((i : int, j : int) : int_pair) -
你所有的函数都有相同的类型,只是当你专门使用你的类型同义词时,解释器也是如此——如果你输入
fun sip7 (ip: int * int) = ip : int_pair;,你会得到val sip7 = fn : int * int -> int_pair。跨度> -
是的,我已经看到“所有函数都只接受一个参数”的说法,但不知道该怎么做,因为我看到函数具有多个传入变量。所以技术上
fun sip3 (i : int, j : int) = (j,i)没有得到两个变量,而是一个打包为元组。那么为什么显然两个传入的因变量被认为只是一个呢?这背后的计算机科学理论是什么? - 我原来的问题可以表述为。这是来自 lambda 演算世界的东西吗?我看过 ML 教程,这些教程让你从 lambda 演算开始。 . . . -
sip1和sip3使用模式匹配。模式匹配能够解包元组,将项目绑定到i和j(在这种情况下)。 SML 函数定义能够使用模式匹配并不意味着这样定义的函数是多于 1 个变量的函数。