2011-04-02 49 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