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

これを2回使用して、目的を達成できます。

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 に答える