Здравствуйте, Евгений.
2014-06-12 18:09 GMT+04:00 Евгений Золотарёв <
cosm...@gmail.com>:
> 1)Есть типы:
>
> data GeoPoint a = GeoPoint {px, py :: a}
> data PlskPoint a = PlskPoint {px, py :: a}
>
> Есть ли смысл описать один тип data Point a = Point {px, py :: a}, а затем
> создавать экземпляры и уже работать с ними?
Зависит от Ваших задач. Часто для "эмуляции" ООП используют следующий
подход:
data Point a = Point a
class IsPoint p where
toPoint :: p -> Point
fromPoint :: Point -> b
instance IsPoint GeoPoint
instance IsPoint PIskPoint
Возможно расширить его методом:
asPoint :: a -> (Point -> Point) -> a
который может позволить не терять состояние в Вашем типе.
> Чтобы можно было использовать функцию вида f :: GeoPoint -> PlskPoint,
> соответственно свой Show для каждого типа.
для таких задач вам нужен newtype.
newtype GeoPoint a = GeoPoint { unGeoPoint :: Point a }
для таких типов можно добавлять свои реализации типов-классов и они не
вносят runtime cost.
> На мой взгляд так правильнее
> чтоли.
не могу сказать.
> 2) Я понимаю, что это противоречит идее функтора, но возможно ли в
> instance Functor Point where
> fmap f (Point a b) = Point (f a) (f b)
>
> f применять только к а?
Не противоречит, например вы можете посмотреть инстанс для кортежа, там
функция применяется только ко второму элементу:
Prelude> fmap succ (0,0)
(0,1)
Я сильно извиняюсь, но я бы все же посоветовал взяться за какую-либо
базовую литературу.
--
Alexander