(define min
(lambda (l)
(cond
((null? l) '())
((null? (cdr l)) (car l))
(#t (let ((a (car l))
(b (min (cdr l))))
(if (< b a) b a))))))我正在尝试将前面的Scheme代码转换成OCaml代码,到目前为止,我有以下代码:
let minList x =
match x with
| [] -> []
| hd::tl when tl = [] -> hd
| hd::tl -> if minList tl < hd then minList tl else hd然而,我得到了一个错误,说“这个表达式有一个list类型,但是一个表达式应该是'a list list -> 'a list list类型的。”
我是函数式语言的初学者,任何帮助都将不胜感激。
发布于 2015-11-06 18:31:37
这与类型系统不同。
使用Scheme,该函数可以输出一个数字或一个空列表。
> (min `(1 2 3))
1
> (min `())
()使用OCaml则不能,输出必须是相同类型的。您可以在Real World Ocaml中阅读有关类型推断的更多信息。
你不想从一个空的列表中返回一个int,你想失败。
您可以做的是使用选项类型,以便函数从一个空列表输出None,并从一个非空的'a list输出Some 'a。因此,函数的类型将是'a list -> 'a option。
顺便说一句,case | hd::tl when tl = [] -> hd可以简化为| [x] -> x。就像tl = [],hd::tl = hd::[] = [hd]。
发布于 2015-11-06 17:03:40
我在你的代码中发现了两个错误:
你的函数是递归的,所以你需要将关键字rec添加到你的函数中,就像这个let rec minList x
'a list -> 'a类型,但是因为在第一个模式匹配中,你会返回一个列表,所以你会得到这个错误。因为您正在使用'a list',所以最好保留列表的第一个元素,然后如果列表最后是空的,则返回第一个元素(这是列表的最小值)。https://stackoverflow.com/questions/33562667
复制相似问题