Немного вопросов

27 views
Skip to first unread message

Евгений Золотарёв

unread,
Jun 12, 2014, 10:09:53 AM6/12/14
to haskell...@googlegroups.com
1)Есть типы:

data GeoPoint a = GeoPoint {px, py :: a}
data PlskPoint a = PlskPoint {px, py :: a}

Есть ли смысл описать один тип data Point a = Point {px, py :: a}, а затем создавать экземпляры и уже работать с ними?
Чтобы можно было использовать функцию вида f :: GeoPoint -> PlskPoint, соответственно свой Show для каждого типа.На мой взгляд так правильнее чтоли.

2) Я понимаю, что это противоречит идее функтора, но возможно ли в
instance Functor Point where
fmap f (Point a b) = Point (f a) (f b)

f применять только к а?


Alexander V Vershilov

unread,
Jun 12, 2014, 10:19:43 AM6/12/14
to haskell...@googlegroups.com
Здравствуйте, Евгений.


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
Reply all
Reply to author
Forward
0 new messages