Haskell 如何确定类型?
我写了一些xyz程序,在屏幕上打印了一些东西,非常不相关。在这段代码中,我发现如果我删除了一行与我想要打印的内容无关的内容,我会得到一个错误Haskell 如何确定类型?,haskell,Haskell,我写了一些xyz程序,在屏幕上打印了一些东西,非常不相关。在这段代码中,我发现如果我删除了一行与我想要打印的内容无关的内容,我会得到一个错误 import Data.Array horizontal inArray limit listLen = [ findProd i j | i<-[1..limit], j<-[1..(limit - listLen)]] where findProd a b = product [ inAr
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
导入数据。数组
水平inArray limit listLen=[findProd i j | i您得到的错误消息是:
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
,编译器决定inaray
是Show
的一个实例。删除打印意味着无法确定
添加显式类型声明将有所帮助,因为read
的类型是read::read a=>String->a
(例如,它可以返回任何内容)编译器无法知道这是Show
的一个实例。我假设您正在读取某种数字,因为该文件名为matrix.txt
?您可以尝试类似的方法
let readInt = read :: String -> Integer
let inArray = listArray ((1,1),(limit,limit)) $ (map readInt (words x))
现在编译器知道inArray是一个整数数组,因此可以显示。您得到的错误消息是:
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
,编译器决定inaray
是Show
的一个实例。删除打印意味着无法确定
添加显式类型声明将有所帮助,因为read
的类型是read::read a=>String->a
(例如,它可以返回任何内容)编译器无法知道这是Show
的一个实例。我假设您正在读取某种数字,因为该文件名为matrix.txt
?您可以尝试类似的方法
let readInt = read :: String -> Integer
let inArray = listArray ((1,1),(limit,limit)) $ (map readInt (words x))
现在编译器知道inArray是一个整数数组,因此可以显示。您可以将编译错误添加到问题中吗?您可以将编译错误添加到问题中吗?或者等效地inArray::array(Int,Int)Int
,只是帮助编译器决定要读取的特定类型。或等效地inaray::Array(Int,Int)Int
,只是帮助编译器决定要读取的特定类型。