我想写一个类型为
的函数 int -> 'a -> (int, int) slowa list
我想知道我是否需要首先确定类型slowa
如果是这样,这就是我定义“slowa”的方式
type slowa =
(_,_)
|('a, 'b) of int * int
;;
slowa
类型(int, int)
的位置
但我不确定如果我正在思考。我很感激一些帮助。我是新手:)
编辑: 所以现在我继续尝试这个:
type ('b, 'a) slowa = int * 'b
let c = 3, 5;;
let d = 1, 3;;
let rec add k v d =
match d with
| [] -> [(k, v)]
| (k', v')::t ->
if k = k'
then (k, v) :: t
else (k', v') :: add k v t
;;
但我希望函数add
的类型与此类型类似:int -> 'a -> (int, int) slowa list
如果我只想返回list
会更容易,但现在返回类型为int -> 'a -> (int, int) slowa list
会让人感到困惑......:/我对参数的数量/类型保持正确。
答案 0 :(得分:3)
如果您只想要一个类型为int * int
(整数对)的同义词,您可以这样定义:
type slowa = int * int
在这种情况下,名称只是一个同义词。您始终可以根据定义替换名称的使用。所以你实际上并不需要做出定义(这对文档很有用)。
如果要定义 new 类型,则需要为其定义构造函数:
type myslowa = Slow of int * int
这定义了一种新类型。类型的值类似于Slow (3, 4)
。这些值的类型与其他值不同;即,它们不能与一对整体互换。
如果要定义参数化类型,则需要在定义中包含参数:
type ('a, 'b) pslowa = 'a * 'b
由于没有新的构造函数,这也只是一个同义词。但它是无限类型的同义词。特别是,它是任何两种类型的对的同义词。
如果要定义 new ,参数化类型,则需要同时具有参数和构造函数:
type ('a, 'b) mypslowa = Slow of 'a * 'b
这结合了属性;即,它是一种表示任意两种类型的对的新类型。
我希望这会有所帮助;其中一个可能接近你正在寻找的东西。
<强>更新强>
根据您对slowa
的新定义,类型(int, int) slowa
与类型int * int
相同。当toplevel向您显示某事物的类型时,它必须在所有表示类型的方式中进行选择。我想你所说的是,顶层选择使用int * int
而不是(int, int) slowa
。最好不要太挂在这上面(恕我直言)。您可能尝试的一件事是注释您的类型:
type ('b, 'a) slowa = int * 'b
let c = 3, 5;;
let d = 1, 3;;
let rec add k v (d: ('a, 'b) slowa list) : ('a, 'b) slowa list =
match d with
| [] -> [(k, v)]
| (k', v')::t ->
if k = k'
then (k, v) :: t
else (k', v') :: add k v t
;;
(你对slowa
的定义看起来有点奇怪,因为你没有使用'a参数来做任何事情。)