1

我有这个代码:

type Matrice = [[String]]
matr =[[" - "," 0 "," - "],[" - "," - "," - "],[" - "," - "," - "]]       

changeValue :: Matrice ->Int->Int->Matrice
changeValue mat x y = [
    if ((mat !! x) !! y) /= " - "
        then mat
        else do (replaceNth y " P " xs)
    | xs <- (mat !! x)
    ]

replaceNth :: 函数将位置值 ' - ' 替换为 (' P ')

replaceNth :: Int -> String -> [String] -> [String]
replaceNth n newVal (x:xs)
     | n == 0 = newVal:xs
     | otherwise = x:replaceNth (n-1) newVal xs

我想将矩阵中的每个案例都更改为 ' - ' 为 ' P '

但它不工作,我总是这个错误:

couldn't match type [char] with char
4

1 回答 1

4

我是 Haskell 的新手,所以这在很多方面可能不是最优的,但我发现使用 Haskell 是函数式和多态的这一事实来用更通用的替换你的 replaceNth 函数很有趣,它替换列表中的元素将函数应用于所述元素的结果:

changeNth :: Int->(a->a)->[a]->[a]
changeNth n change (x:xs)
     | n == 0 = (change x):xs
     | otherwise = x:changeNth (n-1) change xs

现在你可以使用它两次来完成你想要的:

changeValue :: Matrice ->Int->Int->Matrice
changeValue mat x y = changeNth x (changeNth y
  (\v -> if v==" - " then " P " else v)) mat

我的测试:

λ: let matr =[[" - "," 0 "," - "],[" - "," - "," - "],[" - "," - "," - "]]
λ: changeValue matr 1 1
[[" - "," 0 "," - "],[" - "," P "," - "],[" - "," - "," - "]]
λ: changeValue matr 0 1
[[" - "," 0 "," - "],[" - "," - "," - "],[" - "," - "," - "]]
于 2014-11-14T16:55:48.183 回答