2017-04-24 93 views
-1

我想定义一个函数,它需要三个参数,坐标i,j和矩阵本身。 它必须改变给定位置(i,j)的入口并返回新的矩阵。如何更改矩阵条目并返回矩阵

我的预定义的矩阵:

fieldA 1 1 = 0 
fieldA 1 2 = 1 
fieldA 2 1 = 1 
fieldA 2 2 = 0 

我第一次尝试下面的代码&错误:

changeValue i j matrix = 
     do matrix i j <- 0 
     return matrix 

test.hs:113:12: error: 
    Parse error in pattern: matrix 
    Possibly caused by a missing 'do'? 

我的第二个attemt是下面的代码&错误:

changeValue i j matrix = 
     map (\a b -> if a == i && b == j then matrix i j <- 0 else matrix i j <- matrix i j) matrix 

test.hs:113:58: error: 
    parse error on input ‘<-’ 
    Perhaps this statement should be within a 'do' block? 

我认为解决方案很简单,但我绝对乞求在内部Haskell和 我希望任何形式的帮助

+0

你为什么使用''''和''块? 'fieldA'是一个矩阵?它对我来说看起来像一个功能。第二个想法是,这是一个定义矩阵的有效方法,只是不是一个非常直观的IMO。更改“矩阵”最后一列的值意味着创建一个新的“矩阵”,如果输入与您正在更改的输入相匹配,则返回新值。 – Lazersmoke

+0

@Lazersmoke是的,你是对的。 'fieldA'是一个函数,但应该表示一个矩阵。背后的想法是游戏“战舰”。我只尝试使用'<-',因为'='不起作用。我得到了错误信息:_Perhaps此语句应该在'做'块?_。这就是我试图使用do块的原因。 – Landau

回答

1

也许你想是这样的:

changeValue :: Int -> Int -> Matrix -> Matrix 
changeValue i j matrix = matrix2 
    where 
    matrix2 i2 j2 | i2==i && j2==j = 0 
       | otherwise  = matrix i2 j2 

建议始终类型签名添加到您的顶层绑定。这可以极大地帮助澄清自己的想法,并帮助编译器提供良好的错误消息。

+0

在这里,'type Matrix = Int - > Int - > Int'。另外,where子句是多余的,并且可以内联以获得相同的效果。 – Lazersmoke