2011-04-02 18 views
0

私はいくつかのxyzプログラムを書いて、スクリーンに何かを印刷します。無関係です。このコードでは、印刷したいものと関係のない行を削除すると、エラーが発生することがわかりました。私はタイプはどのように決定されますか?

let maxprod = maximum $ map maximum $ map (\f -> f inArray limit listLen) [horizontal,vertical,rightDiag,leftDiag]

行を削除する場合

ここ
import Data.Array 

horizontal inArray limit listLen = [ findProd i j | i<-[1..limit], j<-[1..(limit - listLen)]] 
      where 
      findProd a b = product [ inArray!(a,b+k) | k<-[0..(listLen-1)] ] 

vertical inArray limit listLen = [ findProd i j | i<-[1..(limit-listLen)], j<-[1..limit]] 
      where 
      findProd a b = product [ inArray!(a+k,b) | k<-[0..(listLen-1)] ] 

rightDiag inArray limit listLen = [ findProd i j | i<-[1..(limit - listLen)], j<-[1..(limit - listLen)] ] 
      where 
      findProd a b = product [ inArray!(a+k,b+k) | k<-[0..(listLen-1)] ] 

leftDiag inArray limit listLen= [ findProd i j | i <-[1..(limit - listLen)],j<-[listLen..limit] ] 
      where 
      findProd a b = product [ inArray!(a+k,b-k) | k<-[0..(listLen-1)] ] 

solve = do 
     x <- readFile "matrix.txt"    
     let limit = 20 
     let listLen = 4 
     let inArray = listArray ((1,1),(limit,limit)) $ (map read (words x)) 
     let maxprod = maximum $ map maximum $ map (\f -> f inArray limit listLen) [horizontal,vertical,rightDiag,leftDiag] 
     print inArray 

私はコンパイルエラーを取得しています。どうやって?それは私が印刷したいものにさえ関連していません。

+3

質問にコンパイルエラーを追加できますか? –

答えて

5

あなたが取得しているエラーメッセージは次のとおりです。

Ambiguous type variable `a' in the constraints: 
    (Read a) arising from a use of `read' at Temp.hs:23:63-66 
    (Show a) arising from a use of `print' at Temp.hs:25:9-13 
Probable fix: add a type signature that fixes these type variable(s) 

あなたはコンパイラがinarrayShowのインスタンスであることを決定しましたprintを使用しましたので。印刷物を取り除くことは、それを判断する手段がないことを意味します。 readのタイプはread :: Read a => String -> aである(例えば、それは何かを返すことができます)と、コンパイラはnowingの方法はありません、これはShowのインスタンスであると明示的な型宣言を追加する

が役立ちます。私はファイルがmatrix.txtと呼ばれているので、何らかの番号を読んでいると思いますか?あなたはこのようなものを試すことができます。

let readInt = read :: String -> Integer 
let inArray = listArray ((1,1),(limit,limit)) $ (map readInt (words x)) 

そして、コンパイラは、inArrayが整数の配列であることを知っているので、表示できます。

+0

あるいは、 'inArray :: Array(Int、Int)Int'と同じように、コンパイラがどのような特定の型を'読み込み 'するかを決定するのに役立ちます。 – luqui

関連する問題