从SML

时间:2016-10-21 07:57:57

标签: list record sml

我正在尝试从SML中的记录列表中获取最老的人。我已经按照一个简单的列表开始了:

type person = {age:int, name: string} list

val p:person = [{age=11, name="Marco"},{age=12, name="Polo"}]

fun maxAge [] = NONE
  | maxAge [x] = SOME x
  | maxAge (p1 :: p2 :: xs) = if #age(p1) > #age(p2) then
                                       maxAge (p1 :: xs) 
                                     else
                                       maxAge (p2 :: xs) 

我收到以下错误:

Error: unresolved flex record
(can't tell what fields there are besides #age)

我认为p1和p2将是列表的第一和第二个元素,在我的例子中是名称和年龄{age = 11,name =“Marco”}的记录,我可以通过#age轻松访问值( p1)然后将完整记录p1更深入地发送到递归中,但事实并非如此。为什么呢?

任何提示都将受到高度赞赏。

PS:当我得到正确的记录时,如何只打印名称字符串,这不起作用:

maxAge [x] = SOME #name(x) 

1 个答案:

答案 0 :(得分:1)

我找到了答案in this question,问题是你不能模式匹配“p1”和记录,而是必须这样做:

...
maxAge ({age= p1, name= n1} :: {age= p2, name= n2} :: xs)
...

然后你可以使用“p1”,“p2”,......来继续。