-1

私はHaskellを初めて使用し、「データ」型を宣言する方法と、その型で変数を初期化する方法を理解できません。また、その変数の特定のメンバーの値を変更する方法を知りたいです。例:

data Memory a = A 
  { cameFrom :: Maybe Direction
  , lastVal :: val
  , visited :: [Direction]
  }

方向は N、S、E、W を含むデータ型です。値は int 型です。

init :: Int -> a
init n = ((Nothing) n []) gives me the following error:


The function `Nothing' is applied to two arguments,
but its type `Maybe a0' has none
In the expression: ((Nothing) n [])
In an equation for `init': init n = ((Nothing) n [])

どうすればこれを修正できますか?

更新:これで完了です。どうもありがとうございましたが、別の問題が発生しました

move :: val -> [Direction] -> Memory -> Direction
move s cs m | s < m.lastVal = m.cameFrom
            | ...

これにより、次のエラーが表示されます。

 Couldn't match expected type `Int' with actual type `a0 -> c0'
    Expected type: val
      Actual type: a0 -> c0
    In the second argument of `(<)', namely `m . lastVal'
    In the expression: s < m . lastVal

更新 2: 繰り返しますが、それは私を大いに助けてくれました。どうもありがとうございました

それと、もう一つ質問です(お手数をおかけしてすみません)

タイプの要素のみをアドレス指定するにはどうすればよいですか

Type Cell = (Int, Int)
Type Direction = (Cell, Int)

Cell 変数を Direction 変数の Cell 要素と比較するにはどうすればよいですか?

4

2 に答える 2

2

アップデートに関して。構文

m.lastVal

m.cameFrom

あなたが望むものではありません。その代わり

move s cs m | s < lastVal m = cameFrom m

アクセサーは単なる関数であるため、プレフィックス形式で使用されます。Haskellの.は、名前空間の解決 (パスに依存しない) と関数の合成に使用されます。

(.) :: (b -> c) -> (a -> b) -> a -> c
(.) f g x = f (g x)
于 2012-04-10T17:22:22.033 に答える
1

初期化するには:

init :: Int -> Memory Int
init n = A {cameFrom = Nothing, lastVal = n, visited = []}

値を変更するには: 厳密には値を変更せず、次のように別の値を返します。

toGetBackTo :: Direction -> Memory a -> Memory a
toGetBackTo dir memory = memory {cameFrom = Just dir, visited = dir : visited memory}
于 2012-04-10T16:39:16.937 に答える