【问题标题】:Obtaining the oldest person from record list in SML从SML的记录列表中获取最年长的人
【发布时间】:2016-10-21 16:49:21
【问题描述】:

我正在尝试从 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) 

【问题讨论】:

    标签: list record sml


    【解决方案1】:

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

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

    然后你可以使用 "p1", "p2",... 继续。

    【讨论】:

    • 至少还有一个其他选项:您可以为 maxAge 函数指定显式类型
    猜你喜欢
    • 2014-01-16
    • 2021-06-27
    • 2018-04-27
    • 2020-09-15
    • 2016-10-30
    • 2011-08-18
    • 1970-01-01
    • 2012-02-01
    • 1970-01-01
    相关资源
    最近更新 更多