没有字面意思为“ 1.0”的(Fractional [Double])实例

时间:2019-03-28 20:40:04

标签: haskell

对于类,我们必须为给定的一组问题编写一些代码。这些问题之一是以[[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)

1 个答案:

答案 0 :(得分:6)

问题是

           replicate (y-1) 0.0 : 1.0

顺便说一句,您可以(并且应该)始终舍弃尾随零,所以

           replicate (y-1) 0 : 1

例如,说y=4。然后读到

           [0,0,0] : 1

因此,您要尝试将列表[0,0,0]放在... 列表之前? 11应该如何成为列表?

我不确定您在那里想要什么,但是一个可行的选择是[[1]]