代码之家  ›  专栏  ›  技术社区  ›  b4d

从SML中的记录列表中获取最年长的人

  •  1
  • b4d  · 技术社区  · 8 年前

    我试图从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 回复  |  直到 8 年前
        1
  •  1
  •   Community Egal    7 年前

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

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

    然后您可以使用“p1”、“p2”继续。