所以,我正在逐步学习OCaml,并且我最近遇到了"模块语言的伟大世界"在OCaml。
这是我的问题:
module type TEST = sig
val addend : 'a -> list
end
module Test : TEST =
struct
let addend (val,lol) =
val::lol
end
当我尝试在解释器中使用它时,它告诉我我有一个syntax error
...
我知道这个人是一个讨厌的问题,并且认为堆栈溢出在这里重写的是优化程度很差的代码,但是,经过几个小时的努力寻找解决方案我几乎已经差不多了放弃了......
答案 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
是关键字。您不能将其用作标识符。