2016-10-21 41 views
1

我想從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

我發現我的答案in this question,問題是,你不能模式匹配「 P1" 和記錄,而是它必須這樣做:

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

然後你可以使用‘P1’,‘P2’,...繼續。

+2

至少有一個選項:你可以給你的'maxAge'函數顯式類型 –