我在使用SML中的列表进行模式匹配时遇到了问题。我正在尝试创建一个采用2x2实矩阵(定义为'a list list
)并创建复杂(real * real)
的函数。矩阵被格式化为列表列表(由reals制作),每个列表都是一行。我知道我必须模式匹配,但我不确定如何实现我对实际代码的理解。到目前为止我的代码是:
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)
答案 0 :(得分:4)
好的,如果(a::M)
的类型为real matrix
(或real list list
),则表示a
(头)类型为real list
,{{1} }(tail)的类型为M
。然后real list list
的类型为hd a
,real
的类型为tl M
。所以把它们放在一起,real list list
的类型(hd a, tl M)
,可能不是你想要的。
您可能希望了解对于列表,real * real list list
表示x :: y
是第一个元素,而x
是列表的其余部分(不是第二个元素),这是一个列表。类似地,y
函数返回列表的第一个元素,hd
函数返回列表的其余部分。如果要提取前两个元素,可以使用模式tl
(其中x :: y :: z
是前两个元素后列表的其余部分)。如果您知道它将是一个2元素列表,则可以匹配z
或等效x :: y :: []
。您可以嵌套模式,因此如果您有2元素列表的2元素列表,则可以直接匹配[x, y]
。但是,使用固定大小的列表是糟糕设计的标志。您可能想要使用元组。