1

行列の転置を計算しようとしている F# の割り当てがあります。簡単ですが、値制限エラーが発生し続け、その理由がわかりません。そこにあるVRエラーの質問の多くを調べましたが、私はまだ暗闇の中にいます. これが私のコードです:

let transpose = function
    | [xs ; ys] -> 
                let rec transpose_helper = function
                    | [],[] -> []
                    | x::xs , y::ys -> [x;y] :: transpose_helper (xs,ys)
                    | _ -> failwith "The matrix is not a square matrix"
                transpose_helper(xs,ys)
    | _ -> failwith "Incorrectly formatted input"

transpose ([[1;2;3];[2;3;4]]);;

エラーの一部は空のリストが原因であると思いますが、何も役に立たないようです。任意のポインタをいただければ幸いです。

編集:このコードの次のバージョンは機能します。誰でも理由を説明できますか?

let transpose zs =
    match zs with 
    | [xs;ys] -> 
                let rec transpose_helper (xs, ys) = 
                    match (xs,ys) with
                    | ([],[]) -> []
                    | (x::xs , y::ys) -> [x;y] :: transpose_helper (xs,ys)
                    | _ -> failwith "The matrix is not a square matrix"
                transpose_helper(xs,ys)
    | _ -> failwith "Incorrectly formatted input"

transpose ([[1;2;3];[2;3;4]]);;

val transpose : zs:'a list list -> 'a list list
val it : int list list = [[1; 2]; [2; 3]; [3; 4]]

ただし、let を使用してバインドしない限り、上記の転置呼び出しにはユニット型が必要であると、コンパイラはまだ不平を言っています。誰かがここで何が起こっているのかを明確にしてもらえますか?

4

1 に答える 1

5

私の推測では、最初にこれlet rec transpose zs = match zs with ...を作成し、後で代わりに使用するように変更したfunctionため、明示的な引数の必要がなくなりました。zsまだそこにあるので、関数は2つの引数を受け入れます。つまり、部分的にしか適用していません。は使用されていないためzs、その型が不明であるため、部分的に適用された関数が汎用関数を返します(値の制限)。取り外しzsて、すべて問題ありません。

于 2013-02-11T17:44:30.983 に答える