列表的数据类型 - 莫斯科毫升

时间:2014-02-03 15:25:43

标签: ml

我想表达一份卡片目录和书籍清单。

datatype catalog = KAT of string*catalog list| KIS of string*book list | EMPTY;

我想算一下书。我正在尝试这样做。

fun count([]) = 0
  | count(book) = LIST.length(book)
  | count(x1::xs) = count(x1) + count(xs);`

我收到的不能有类型错误。我该怎样做才能找到书?

1 个答案:

答案 0 :(得分:1)

我认为你必须对功能的定义更加谨慎。例如,您似乎想要使用相同的功能计算内部的所有书籍和目录。这在ML中是不可能的,因为尽管您可以包含函数的多个实例以进行模式匹配,但匹配必须仅在一种类型上完成。

例如,在您的代码中,您似乎希望使用count()来计算给定目录或书籍或目录列表。这可以做到,但这不是ML的通常方式。您必须编写一个函数来计算类型catalog的目录列表中的所有目录,以计算书籍和目录。长度函数按预期工作,因此以下函数可能有效:

fun countcatalogs ([]) = 0 
    | countcatalogs(cat::rest) = countbooks(cat) + countcatalogs(rest)
and
    countbooks (EMPTY) = 0  
    | countbooks (KIS(_, l)) = length(l) 
    | countbooks (KAT(_,cat::rest)) = countbooks(cat) + countcatalogs(rest);