2011-02-03 4 views
1
m = [[1,0,0],[2,-3,0],[4,5]] 
t [email protected](x:xs) = let (m, n) = (length all, length x) in all (==n) (map length all) 

コマンド:なぜ「すべて」が私にこの「期待されたタイプに一致できませんでしたか」を与えているのですか?

t m 

ができます:

Couldn't match expected type `(Int -> Bool) -> [Int] -> t' 
     against inferred type `[[a]]' 
In the expression: all (== n) (map length all) 
In the expression: 
    let (m, n) = (length all, length x) in all (== n) (map length all) 
In the definition of `t': 
    t ([email protected](x : xs)) 
      = let (m, n) = ... in all (== n) (map length all) 

答えて

4

シンボルalltのパラメータに再定義するのは、その理由です。したがって、ローカルallはグローバルallをシャドーし、このエラーが発生します。解決策として、ローカルallに別の名前を付けてみてください。

4

をプレリュード機能allが見えなくなるので、あなたは、全体のリストに名前allをバインドしません。別の名前を選択するか、[email protected]を落としてlet (m, n) = (length xs + 1, ...)かそれに類似するものを使用してください。

関連度:なぜlength allを計算するのですか?あなたはどこでもそれを使用しません。

+0

私は、ハスケルがシャドウイングとは別の「すべて」の異なる意味を理解するのに十分にスマートであると思っていました。悲しい。ありがとう – gremo

+4

@Gremo:潜在的に多くの 'すべて'あなたが意味するものを推測する*でしょうか? 1つの名前は1つのことを指し、それは良いことです - 複雑な予算には良い、単純には良い、コードに対する推論には良いです。 – delnan

+0

@delnan:行列mが有効であるかどうかを確認しようとしています(各行の列数は同じです)。 (m、n)はretvalである。 – gremo

関連する問題