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

发布于 2024-12-05 01:00:09 字数 630 浏览 0 评论 0原文

我在与 SML 中的列表进行模式匹配时遇到问题。我正在尝试创建一个函数,该函数采用 2x2 实数矩阵(定义为 'a list list)并创建复杂的 (real * real)。该矩阵被格式化为列表列表(由实数组成),每个列表都是一行。我知道我必须进行模式匹配,但我不确定如何将我的理解应用到实际代码中。到目前为止我的代码是:

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)

I'm having trouble with pattern matching with lists in SML. I'm trying to create a function that takes a 2x2 real matrix (defined as 'a list list) and creates a complex (real * real). The matrix is formatted as a list of lists(that are made with reals) with each list being a row. I know that I have to pattern match but I'm unsure how to implement my understanding into actual code. My code thus far is:

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

I keep getting this error:

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)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

﹏雨一样淡蓝的深情 2024-12-12 01:00:09

好的,如果 (a::M) 具有类型 real matrix (或 real list list),那么这意味着 a(head)的类型为real listM(tail)的类型为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 个元素之后的列表的其余部分) )。如果您知道它将是一个 2 元素列表,则可以匹配 x :: y :: [],或者等效地,[x, y]。您可以嵌套模式,因此如果您有一个 2 元素列表的 2 元素列表,则可以直接匹配 [[a, b], [c, d]]。然而,使用固定大小的列表是糟糕设计的标志。您可能想改用元组。

Okay so if (a::M) has type real matrix (or real list list), then that means a (head) has type real list and M (tail) has type real list list. Then hd a has type real, and tl M has type real list list. So putting them together, (hd a, tl M) has type real * real list list, probably not what you want.

You probably want to understand that for lists, x :: y means that x is the first element, and y is the rest of the list (not the second element), which is a list. Similarly, the hd function returns the first element of a list, and the tl function returns the rest of the list. If you want to extract the first two elements, you could use the pattern x :: y :: z (where z is the rest of the list after the first 2 elements). If you know it's going to be a 2-element list, you could match x :: y :: [], or equivalently, [x, y]. You can nest patterns, so if you have a 2-element list of 2-element lists, you could directly match [[a, b], [c, d]]. However, using a fixed-size list is a sign of bad design. You probably want to use a tuple instead.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文