на днях я написал небольшую программу для сбора кучи чисел в матрица - данные Матрица = Матрица [[Int]]
, начиная с угла - Угол
и следовать по пути - [Направление]
все три типа являются экземплярами класса Transformable
, то у меня есть функция, которая генерирует функцию преобразования, которая поворачивает заданный угол и направление - в LeftUp
и Right
turnLUR :: Transformable a => (Corner, Direction) -> a -> a
, тогда я использую эту функцию чтобы «собрать» все числа в матрице:
harvest :: Matrix → [(Corner,Direction)] → [Int]
harvest _ [] = []
harvest (Matrix []) _ = []
harvest as (cd:csds) = b ++ harvest (Matrix bs) csds' --cd = (Corner,Direction)
where f1 = turnLUR cd -- Matrix -> Matrix
f2 = turnLUR cd -- Corner -> Corner
f3 = turnLUR cd -- Direction -> Direction
Matrix (b:bs) = f1 as -- b = first line of [[Int]]
fcfd (c,d) = (f2 c,f3 d)
csds' = map fcfd csds
Теперь мой вопрос, почему я должен записывать f1
, f2
и f3
inst Рекомендуется использовать одну функцию f
три раза (помня о СУХОМ!) - все три типа Углы
, Направления
и Матрица
являются экземпляры класса Transformable
.
Как мне написать этот код без - создания трех версий «одной и той же» функции?