-3

関数合成に関するチェスナイトの問題を理解するのに苦労しました。演習は、すべてを結合する特定のラッパー関数 (knightProblem) を使用したジェネレーター/フィルター/セレクター チェーンです。

チェーンの最初の部分としての関数 kGenerator が複数のパラメーターをどのように処理する必要があるかは、私にはわかりません。


-- Chess Knight Problem: Generate all Knight moves of length NrMoves
-- that end at the target position
knightProblem :: StartPos -> NrMoves -> TargetPos -> [Moves]
knightProblem =  kSelector . kFilter . kGenerator 

-- kGenerator: needs StartPos, NrMoves, generates all sequences of length NrMoves
-- kFilter: remove all moves which contain invalid positions
-- kSelector: keep all moves which terminate at TargetPos

kGenerator :: ???
???


この種の問題を処理する方法についてのヒントを探しています。

よろしくお願いします。

4

1 に答える 1

1

他の関数の型シグネチャを書き留めてみてください。

-- kSelector: keep all moves which terminate at TargetPos
-- something like
kSelector :: Position -> [Moves] -> [Moves]

-- kFilter: remove all moves which contain invalid positions
-- something like
kFilter :: [Moves] -> [Moves]

したがって、以下kGeneratorを提供する必要kFilterがあるよう[Moves]です:

kGenerator :: Position -> [Moves]

何があるか考えてみてください[Moves]。これはおそらく のようなもの[[Position]]で、一連の動きを表す位置リストのリストです。

特定の位置から移動を生成する明白な方法は、8 つの可能な移動を実行してから、これらの位置のそれぞれからより多くの移動を再帰的に生成することです。

うまくいけば、これがあなたの課題を解決するのに役立ちます:)

于 2016-04-12T22:03:04.463 に答える