Haskell 如何确定类型?

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

我写了一些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
导入数据。数组

水平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
,只是帮助编译器决定要读取的特定类型。