2011-09-16 21 views
1

SMLのリストとのパターンマッチングに問題があります。私は2x2の実数行列('a list listとして定義)をとり、複合体(real * real)を作成する関数を作成しようとしています。行列は、各リストが行であるリストのリスト(実数で作られたリスト)としてフォーマットされます。私は一致をパターン化しなければならないことを知っていますが、私は実際のコードに私の理解をどのように実装するのかは分かりません。私のコードは、これまでのところです:SML/NJでリスト/パターンマッチングを使用

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

私はこのエラーを得続ける:real matrix(またはreal list list)を入力している(a::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(頭が)を入力していることを意味しreal listM (尾)タイプはreal list listです。次にhd aはタイプrealtl Mはタイプreal list listです。したがって、それらをまとめると、(hd a, tl M)のタイプはreal * real list listになります。おそらくあなたが望むものではありません。

リストの場合、x :: yは、xが最初の要素であり、yが残りのリスト(2番目の要素ではありません)であることを意味します。これはリストです。同様に、hd関数はリストの最初の要素を返し、tl関数は残りのリストを返します。最初の2つの要素を抽出する場合は、x :: y :: zというパターンを使用できます(最初の2つの要素の後にはzがリストの残りの部分です)。 2要素のリストになることがわかっている場合は、x :: y :: []、またはそれに相当する[x, y]と一致させることができます。パターンをネストすることができるので、2要素リストの2要素リストがある場合は、[[a, b], [c, d]]と直接一致させることができます。しかし、固定サイズのリストを使用することは、デザインが悪いことの兆候です。代わりにタプルを使用したいと思うかもしれません。

+0

ええ、私は間違って挿入表記を使用していたことを認識していませんでした。ありがとう! – deedex11

関連する問題