模块OCaml中的函数声明

时间:2017-05-13 15:11:58

标签: function ocaml

所以,我正在逐步学习OCaml,并且我最近遇到了"模块语言的伟大世界"在OCaml。

这是我的问题:

module type TEST = sig
    val addend : 'a -> list
end

module Test : TEST =
    struct
        let addend (val,lol) = 
        val::lol
    end

当我尝试在解释器中使用它时,它告诉我我有一个syntax error ... 我知道这个人是一个讨厌的问题,并且认为堆栈溢出在这里重写的是优化程度很差的代码,但是,经过几个小时的努力寻找解决方案我几乎已经差不多了放弃了......

OCaml很酷,但为什么这么难。

2 个答案:

答案 0 :(得分:1)

首先,在模块类型的定义中:您必须指定列表元素的类型。您无法单独使用list

以下代码将编译:

module type TEST = sig
    val addend : 'a -> 'a list
end;;

但是不会做你想要的,因为你想稍后定义一个带有元素,列表并将这个元素放在这个列表中的函数。 所以这种功能的签名是:

'a -> 'a list -> 'a list

所以模块的类型应为:

module type TEST = sig
    val addend : 'a -> 'a list -> 'a list
end;;

实施:

module Test : TEST =
struct 
     let addend a l = a::l
end
;;

请注意,在您的代码中,您可能会受到C语言的影响,您可以在括号中传递参数。在Ocaml中,括号用于元组;这意味着您的实现与签名不同。

答案 1 :(得分:1)

您会收到语法错误,因为val是关键字。您不能将其用作标识符。