2016-04-12 9 views
-3

Ich habe Schwierigkeiten, ein Problem mit Chess Knight bezüglich Funktionszusammensetzung zu verstehen. Die Übung ist ein Generator/Filter/Selektor Kette mit einer gegebenen Wrapper-Funktion (KnightProblem), die alles zusammenklebt.haskell Chess Knight Tour: Funktionszusammensetzung

Es ist mir unklar, wie die Funktion kGenerator als das erste Stück in der Kette mehr Parameter behandeln soll:

 

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

 

Ich suche Hinweise, wie diese Art von Problemen zu behandeln.

Mit freundlichen Grüßen.

Antwort

1

Versuchen Sie, Typensignaturen für die anderen Funktionen aufzuschreiben.

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

So sieht es aus wie kGenerator sollte kFilter bieten mit [Moves]:

kGenerator :: Position -> [Moves] 

Überlegen Sie, was [Moves] sind; Dies ist wahrscheinlich so etwas wie [[Position]], eine Liste von Positionslisten, die die Kette von Zügen darstellen.

Eine offensichtliche Möglichkeit, Bewegungen von einer bestimmten Position aus zu generieren, wäre, die acht möglichen Züge auszuführen und dann rekursiv mehr Züge von jeder dieser Positionen zu generieren.

Hoffentlich wird Ihnen helfen, durch Ihre Aufgabe bekommen :)

+0

dank 9000. mein Fokus auf der „unveränderlich“ ist knightProblem = kSelector. kFilter. kGenerator-Kettengleichung. Ich habe das Problem nur "gelöst", indem ich zusammengesetzte Datatypen eingeführt habe, so dass jede Komponentenfunktion nur ein Argument hat, wie kGenerator :: Job -> ..., aber das ist ein anderes Problem und nicht das angegebene :) – SnDnFn

+0

Wenn Sie brauchen kann ein Argument "durch" eine Funktion übergeben, ohne es zu ändern. Zum Beispiel kann 'kFilter' ein Tupel' (Position, [Moves]) 'akzeptieren und' (Position, [Moves]) 'zurückgeben, wobei die Position einfach an' kSelector' übergeben wird. – 9000