2016-04-12 1 views
-3

J'ai de la difficulté à comprendre un problème de chevalier d'échecs concernant la composition de la fonction . L'exercice est une chaîne de générateur/filtre/sélecteur avec une fonction d'enveloppe donnée (knightProblem) qui colle tout ensemble.haskell Chess Knight Tour: composition de la fonction

Il me est difficile de savoir sur la façon dont la fonction kGenerator comme la première pièce de la chaîne doit gérer plusieurs paramètres:

 

-- 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 :: ??? 
??? 

 

Je cherche des conseils sur la façon de gérer ce genre de problèmes.

Cordialement.

Répondre

1

Essayez d'écrire des signatures de type pour les autres fonctions.

-- 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] 

Il semble donc que kGenerator devrait fournir kFilter avec [Moves]:

kGenerator :: Position -> [Moves] 

Pensez à ce que [Moves] sont; c'est probablement quelque chose comme [[Position]], une liste de listes de position représentant la chaîne de coups.

Une façon évidente de générer des déplacements à partir d'une position donnée serait de faire les 8 mouvements possibles, puis de générer de manière récursive plus de mouvements à partir de chacune de ces positions.

Espérons que cela vous aidera à passer à travers votre mission :)

+0

grâce 9000. Je mets l'accent sur la « immuable » knightProblem = kSelector. kFilter. kÉquation de la chaîne du générateur. J'ai seulement "résolu" le problème en introduisant des types de données composés de sorte que chaque fonction de composant ait un seul argument, comme kGenerator :: Job -> ..., mais c'est un problème différent et pas celui spécifié :) – SnDnFn

+0

Si vous avez besoin peut passer un argument "à travers" une fonction sans le changer. Par exemple, 'kFilter' peut accepter un tuple' (Position, [Moves]) 'et retourner' (Position, [Moves]) ', en passant simplement la position à' kSelector' qui en a besoin. – 9000