首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否将方案转换为OCaml?('a list vs 'a list list -> 'a list list)

是否将方案转换为OCaml?('a list vs 'a list list -> 'a list list)
EN

Stack Overflow用户
提问于 2015-11-06 16:42:52
回答 2查看 446关注 0票数 0
代码语言:javascript
复制
(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代码,到目前为止,我有以下代码:

代码语言:javascript
复制
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类型的。”

我是函数式语言的初学者,任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2015-11-06 18:31:37

这与类型系统不同。

使用Scheme,该函数可以输出一个数字或一个空列表。

代码语言:javascript
复制
> (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]

票数 1
EN

Stack Overflow用户

发布于 2015-11-06 17:03:40

我在你的代码中发现了两个错误:

你的函数是递归的,所以你需要将关键字rec添加到你的函数中,就像这个let rec minList x

  • Your函数应该有'a list -> 'a类型,但是因为在第一个模式匹配中,你会返回一个列表,所以你会得到这个错误。因为您正在使用'a list',所以最好保留列表的第一个元素,然后如果列表最后是空的,则返回第一个元素(这是列表的最小值)。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33562667

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档