полиморфизм в haskell - использование нескольких версий одной функции без присвоения ей разных имен

на днях я написал небольшую программу для сбора кучи чисел в матрица - данные Матрица = Матрица [[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 .

Как мне написать этот код без - создания трех версий «одной и той же» функции?

5
задан epsilonhalbe 5 February 2012 в 16:53
поделиться