我正在尝试从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)
答案 0 :(得分:1)
我找到了答案in this question,问题是你不能模式匹配“p1”和记录,而是必须这样做:
...
maxAge ({age= p1, name= n1} :: {age= p2, name= n2} :: xs)
...
然后你可以使用“p1”,“p2”,......来继续。