2011-09-16 59 views
1

我在使用SML中的列表進行模式匹配時遇到了問題。我試圖創建一個採用2×2實數矩陣(定義爲'a list list)並創建一個複雜的函數(real * real)。該矩陣被格式化爲列表(使用實數製成)的列表,每個列表是一行。我知道我必須模式匹配,但我不確定如何將我的理解實現爲實際代碼。我的代碼到目前爲止是:在SML/NJ中使用列表/模式匹配

fun fromMatrix ((a::M):real matrix) : complex = (hd a, tl M); 

我不斷收到此錯誤:

stdIn:1.5-13.32 Error: right-hand-side of clause doesn't agree with function result type [tycon mismatch] 
    expression: real * real list list 
    result type: complex 
    in declaration: 
    fromMatrix = 
     (fn <pat> :: <pat> : real matrix => (hd <exp>,tl <exp>): complex) 

回答

4

好了,所以如果(a::M)的類型爲real matrix(或real list list),那麼這意味着a(頭)的類型爲real listM (尾)有real list list。然後hd a具有類型realtl M具有類型real list list。所以把它們放在一起,(hd a, tl M)有類型real * real list list,可能不是你想要的。

你可能想明白,列表,x :: y意味着x是第一要素,而y是列表(沒有第二個元素),這是一個列表的其餘部分。同樣,hd函數返回列表的第一個元素,而函數tl返回列表的其餘部分。如果要提取前兩個元素,則可以使用x :: y :: z(其中z是前兩個元素之後的列表的其餘部分)。如果您知道這將是一個2元素列表,則可以匹配x :: y :: []或等效地[x, y]。你可以嵌套模式,所以如果你有一個2元素列表的2元素列表,你可以直接匹配[[a, b], [c, d]]。但是,使用固定大小的列表是設計不佳的標誌。你可能想使用一個元組來代替。

+0

是的我沒有意識到我使用中綴表示法錯誤。謝謝! – deedex11