2016-04-12 5 views
-3

Я плохо разбираюсь в проблеме шахматного рыцаря, касающейся функции композиции. Упражнение представляет собой цепочку генератора/фильтра/селектора с заданной функцией обертки (knightProblem), которая склеивает все вместе.haskell Chess Knight Tour: Функциональная композиция

Неясно мне, как функция 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 должен обеспечить kFilter с [Moves]:

kGenerator :: Position -> [Moves] 

Подумайте о том, что [Moves] являются; это, вероятно, что-то вроде [[Position]], список списков позиций, представляющих цепочку ходов.

Очевидным способом генерации движений из данной позиции будет выполнение 8 возможных ходов, а затем рекурсивное генерирование большего количества перемещений из каждого из этих положений.

Надеется, это поможет вам получить через уступку :)

+0

спасибо 9000. моего внимания на «неизменный» knightProblem = kSelector. kFilter. kGenerator цепное уравнение. Я только «решил» проблему, введя составные типы данных, так что каждая компонентная функция имеет только один аргумент, такой как kGenerator :: Job -> ..., но это другая проблема, а не заданная :) – SnDnFn

+0

Если вам нужно, вы может передать аргумент «через» функцию без ее изменения. Например, 'kFilter' может принимать кортеж' (Position, [Moves]) 'и возвращать' (Position, [Moves]) ', просто передавая позицию в' kSelector', которая в ней нуждается. – 9000

Смежные вопросы