我想表达一份卡片目录和书籍清单。
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);`
我收到的不能有类型错误。我该怎样做才能找到书?
答案 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);