这是我的代码:
sumOfSquare :: Int -> Int -> Int
sumOfSquare a b = a * a + b * b
hipotenuse :: Int -> Int -> Int
hipotenuse a b = truncate(sqrt(x))
where x = fromIntegral(sumOfSquare a b)
squareCheck :: Int -> Bool
squareCheck n = truncate(sqrt(x)) * truncate(sqrt(x)) == n
where x = fromIntegral n
isItSquare :: Int -> Int -> Bool
isItSquare a b = squareCheck (sumOfSquare a b)
data SidesType = Sides Int Int Int deriving (Show)
calc :: Int -> [SidesType]
calc a = [(Sides x y (hipotenuse x y)) | x <- [1..a], y <-[1..a], (isItSquare x y)]
test :: Int -> SidesType
test a = (Sides 1 2 3)
我需要显示calc的结果。它不起作用:
*Main> calc
<interactive>:1:0:
No instance for (Show (Int -> [SidesType]))
arising from a use of `print' at <interactive>:1:0-3
Possible fix:
add an instance declaration for (Show (Int -> [SidesType]))
In a stmt of an interactive GHCi command: print it
正确调用测试工作:
*Main> test 1
Sides 1 2 3
正如我所说,原因是calc函数返回SidesType和Haskell列表可以显示SidesType,但不能显示SidesType列表。
我是否需要更改SidesType说明?或者我是否需要以其他方式修复错误?
还有一个问题 - 我可以在不定义新数据类型的情况下显示calc函数的结果:
calc :: Int -> (Int, Int, Int)
calc a = [x y (hipotenuse x y) | x <- [1..a], y <-[1..a], (isItSquare x y)]
答案 0 :(得分:6)
显示calc
的结果就像使用test
的结果一样:
*Main> calc 4
[Sides 3 4 5,Sides 4 3 5]
您试图显示calc
的值,这是您无法做到的;没有可以打印的函数的表示(这应该是有意义的 - show
,至少在默认情况下,应该显示可以read
的内容,而你不能这样做有功能)。如果Haskell可以显示某些内容,那么它可以显示一些内容;
instance Show a => Show [a] where
...
(Read
,Eq
和Ord
也有相似的例子:可读事物的列表本身是可读的,可以比较的事物列表本身可以比较为了平等,可以订购的东西清单本身可以订购。)
是的,您可以使用元组而不是定义SidesType
:
calc :: Int -> [(Int, Int, Int)]
calc a = [(x,y,hipotenuse x y) | x <- [1..a], y <- [1..a], isItSquare x y]
您撰写的内容 - x y (hipotenuse x y)
- 尝试使用两个参数x
和y
调用函数hipotenuse x y
。当然,x
不是函数,所以这不起作用。你需要逗号和括号。
此外,由于您似乎是Haskell的新手,所以这里有一些小样式点:人们通常会写truncate $ sqrt x
或truncate (sqrt x)
而不是truncate(sqrt(x))
,并且isItSquare x y
周围的括号列表理解中的1}}和Sides x y (hypotenuse x y)
(哪一个也可以写Sides x y $ hypotenuse x y
)是不必要的。我也可能会写data Sides = Sides Int Int Int deriving (Eq,Show,Read)
而不是data SidesType = Sides ...
,但我真的可能会使用(Int,Int,Int)
来代替,正如您所指出的那样。我可能会通过将Int
替换为Integral
的实例来为函数提供更通用的类型;例如,calc :: Integral i => i -> [(i,i,i)]
。但这更像是一种品味问题。
答案 1 :(得分:1)
正如我所说,理由是 calc函数返回列表 SidesType和Haskell可以显示一个 SidesType,但无法显示列表 SidesType。
没了。它可以显示一个列表。但它无法显示函数Int-&gt; [SidesType]。 所以只提供一个参数来计算。
*Main> calc 100
[Sides 3 4 5,Sides 4 3 5,Sides 5 12 13,Sides 6 8 10,Sides 7 24 25,Sides 8 6 10,Sides 8 15 17,Sides 9 12 15,Sides 9 40 41,Sides 10 24 26,Sides 11 60 61,Sides 12 5 13,Sides 12 9 15,Sides 12 16 20,Sides 12 35 37,Sides 13 84 85,Sides 14 48 50,Sides 15 8 17,Sides 15 20 25,Sides 15 36 39,Sides 16 12 20,Sides 16 30 34,Sides 16 63 65,Sides 18 24 30,Sides 18 80 82,Sides 20 15 25,Sides 20 21 29,Sides 20 48 52,Sides 20 99 101,Sides 21 20 29,Sides 21 28 35,Sides 21 72 75,Sides 24 7 25,Sides 24 10 26,Sides 24 18 30,Sides 24 32 40,Sides 24 45 51,Sides 24 70 74,Sides 25 60 65,Sides 27 36 45,Sides 28 21 35,Sides 28 45 53,Sides 28 96 100,Sides 30 16 34,Sides 30 40 50,Sides 30 72 78,Sides 32 24 40,Sides 32 60 68,Sides 33 44 55,Sides 33 56 65,Sides 35 12 37,Sides 35 84 91,Sides 36 15 39,Sides 36 27 45,Sides 36 48 60,Sides 36 77 85,Sides 39 52 65,Sides 39 80 89,Sides 40 9 41,Sides 40 30 50,Sides 40 42 58,Sides 40 75 85,Sides 40 96 104,Sides 42 40 58,Sides 42 56 70,Sides 44 33 55,Sides 45 24 51,Sides 45 28 53,Sides 45 60 75,Sides 48 14 50,Sides 48 20 52,Sides 48 36 60,Sides 48 55 73,Sides 48 64 80,Sides 48 90 102,Sides 51 68 85,Sides 52 39 65,Sides 54 72 90,Sides 55 48 73,Sides 56 33 65,Sides 56 42 70,Sides 56 90 106,Sides 57 76 95,Sides 60 11 61,Sides 60 25 65,Sides 60 32 68,Sides 60 45 75,Sides 60 63 87,Sides 60 80 100,Sides 60 91 109,Sides 63 16 65,Sides 63 60 87,Sides 63 84 105,Sides 64 48 80,Sides 65 72 97,Sides 66 88 110,Sides 68 51 85,Sides 69 92 115,Sides 70 24 74,Sides 72 21 75,Sides 72 30 78,Sides 72 54 90,Sides 72 65 97,Sides 72 96 120,Sides 75 40 85,Sides 75 100 125,Sides 76 57 95,Sides 77 36 85,Sides 80 18 82,Sides 80 39 89,Sides 80 60 100,Sides 80 84 116,Sides 84 13 85,Sides 84 35 91,Sides 84 63 105,Sides 84 80 116,Sides 88 66 110,Sides 90 48 102,Sides 90 56 106,Sides 91 60 109,Sides 92 69 115,Sides 96 28 100,Sides 96 40 104,Sides 96 72 120,Sides 99 20 101,Sides 100 75 125]
答案 2 :(得分:1)
Haskell可以显示SidesType
的列表就好了,它只是无法显示功能。 calc
是一个功能。如果您要显示calc
的结果,则必须使用参数(calc
类型)调用Int
。