2011-04-02 46 views
0

我寫了一些xyz程序,並在屏幕上打印了一些東西,非常無關緊要。在這段代碼中,我發現如果我刪除與我想要打印的內容無關的行,則會收到錯誤消息。如何確定類型?

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 

在這裏,如果我刪除行

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

我得到一個編譯錯誤。怎麼樣?它甚至與我想要打印的內容沒有關係。

+3

您可以將編譯錯誤添加到問題中嗎? – 2011-04-02 13:09:16

回答

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) 

由於您使用print編譯器已經決定inarrayShow一個實例。刪除印刷意味着它無法確定。

添加明確的類型聲明將有助於爲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',只是* something *來幫助編譯器決定什麼特定類型爲'read'。 – luqui 2011-04-02 22:08:08