Здравствуйте. Изучаю хаскель (по LYAH). В качестве упражнения решил написать небольшую программу для геометрических вычислений: http://paste.org.ru/?qq9jwi
Есть 2 вопроса:
1) Нормальна ли такая структура программы? Лично мне не нравятся конструкторы. Напр. основной Vector x y, и дополнительные vectorFromPoint, vectorFromPoints...: длинные имена, да и основной конструктор с большой буквы, а остальные с маленькой — не красиво. Можно ли как-нибудь сделать функцию, скажем, fromPoints, которая вернет либо вектор, либо отрезок, либу прямую... в зависимости от требуемого типа (напр. vectorLength (fromPoints p q) — тут же хаскель сам может догадаться, что нужен вектор).
2) Вообще, этот код не работает. Выдает это:
/home/toady/xlam/geometr/geom.hs:66:6:
Couldn't match expected type `f' against inferred type `Circle'
`f' is a rigid type variable bound by
the type signature for `area'
at /home/toady/xlam/geometr/geom.hs:65:16
In the pattern: Circle _ r
In the definition of `area': area (Circle _ r) = pi * r ^ 2
/home/toady/xlam/geometr/geom.hs:69:11:
Couldn't match expected type `f' against inferred type `Circle'
`f' is a rigid type variable bound by
the type signature for `perimeter'
at /home/toady/xlam/geometr/geom.hs:68:21
In the pattern: Circle _ r
In the definition of `perimeter':
perimeter (Circle _ r) = 2 * pi * r
/home/toady/xlam/geometr/geom.hs:72:46:
Couldn't match expected type `Point' against inferred type `f'
`f' is a rigid type variable bound by
the type signature for `distance'
at /home/toady/xlam/geometr/geom.hs:71:20
In the first argument of `vectorFromPoints', namely `p'
In the first argument of `vectorLength', namely
`(vectorFromPoints p q)'
In the expression: vectorLength (vectorFromPoints p q)
Failed, modules loaded: none.