2011-09-16 26 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