在SML / NJ中使用列表/模式匹配

时间:2011-09-16 00:52:33

标签: sml

我在使用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)

1 个答案:

答案 0 :(得分:4)

好的,如果(a::M)的类型为real matrix(或real list list),则表示a(头)类型为real list,{{1} }(tail)的类型为M。然后real list list的类型为hd areal的类型为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]。但是,使用固定大小的列表是糟糕设计的标志。您可能想要使用元组。