OCaml函数类型定义

时间:2013-12-09 15:00:08

标签: ocaml

我想写一个类型为

的函数

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会让人感到困惑......:/我对参数的数量/类型保持正确。

1 个答案:

答案 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参数来做任何事情。)