2016-04-12 19 views
-3

機能構成に関するチェスナイトの問題を理解するのは苦労しました。エクササイズはジェネレータ/フィルタ/セレクタ のラッパー関数(knightProblem)を連鎖してすべてをまとめます。haskellチェスナイトツアー:機能構成

チェーン内の最初の作品としての機能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 :: ??? 
??? 

 

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

よろしくお願いいたします。

答えて

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[Moves]kFilterを提供しなければならないようなので、それが見えます:

kGenerator :: Position -> [Moves] 

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

与えられた位置から移動を生成する明白な方法は、8つの可能な移動を行い、次にこれらの位置のそれぞれからより多くの移動を再帰的に生成することです。

うまくいけば、これはあなたの割り当て:) 9000私の焦点は「不変」である

+0

おかげknightProblem = kSelectorを介して取得するのに役立ちます。 kFilter。 kGeneratorチェーンの式。すべてのコンポーネント関数がkGenerator :: Job - > ...のように1つの引数しか持たないように複合データ型を導入することによって問題を "解決"しましたが、それは指定されたものではなく別の問題です。 – SnDnFn

+0

関数を変更せずに引数を渡すことができます。例えば、 'kFilter'はタプル'(Position、[Moves]) 'を受け入れ、'(Position、[Moves]) 'を返すだけで、それを必要とする' kSelector'に位置を渡すだけです。 – 9000