对于类,我们必须为给定的一组问题编写一些代码。这些问题之一是以[[Double]]的形式创建一个单位矩阵。到目前为止,我已经提出了以下代码。但是,当我尝试编译时,出现以下错误,不确定我做错了什么或意味着什么
代码:
ident :: Int -> [[Double]]
ident x = identHelper x 0
identHelper :: Int -> Int -> [[Double]]
identHelper y z
| z == 0 = ([1.0] ++ replicate (y-1) 0.0) : identHelper y 1
| y == z = replicate (y-1) 0.0 : 1.0
| otherwise = (replicate z 0.0 ++ [1.0] ++ replicate (y-z-1) 0.0) : identHelper y (z+1)
错误:
• No instance for (Fractional [[Double]])
arising from the literal ‘1.0’
• In the second argument of ‘(:)’, namely ‘1.0’
In the expression: replicate (y - 1) 0.0 : 1.0
In an equation for ‘identHelper’:
identHelper y z
| z == 0 = ([1.0] ++ replicate (y - 1) 0.0) : identHelper y 1
| y == z = replicate (y - 1) 0.0 : 1.0
| otherwise
= (replicate z 0.0 ++ [1.0] ++ replicate (y - z - 1) 0.0)
: identHelper y (z + 1)
答案 0 :(得分:6)
问题是
replicate (y-1) 0.0 : 1.0
顺便说一句,您可以(并且应该)始终舍弃尾随零,所以
replicate (y-1) 0 : 1
例如,说y=4
。然后读到
[0,0,0] : 1
因此,您要尝试将列表[0,0,0]
放在... 列表之前? 1
。 1
应该如何成为列表?
我不确定您在那里想要什么,但是一个可行的选择是[[1]]
。