Ошибка в функторе

42 views
Skip to first unread message

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

unread,
Jun 9, 2014, 2:31:47 PM6/9/14
to haskell...@googlegroups.com
module Main where
	
	data Point a = Point {pointx :: Double, pointy :: Double} deriving Show

	instance Num (Point a) where
		(+) p1 p2 = Point (pointx p1 + 	pointx p2) (pointy p1 + pointy p2)

					

	increase :: Double -> Double -> Double
	increase p1 _ = p1 + 1 	

	instance Functor Point where
		fmap f (Point(pointx, pointy)) = Point (f pointx, f pointy)


--Constructor `Point' should have 2 arguments, but has been given 1
--  In the pattern: Point (pointx, pointy)
--  In an equation for `fmap':
--      fmap f (Point (pointx, pointy)) = Point (f pointx, f pointy)
--  In the instance declaration for `Functor Point'


Что я делаю не так?

Mike Potanin

unread,
Jun 9, 2014, 2:36:05 PM6/9/14
to haskell...@googlegroups.com
Тип должен быть fmap :: (a -> b) -> Point a -> Point b для любых a и
b, а не только для Double.
> --
> Вы получили это сообщение, поскольку подписаны на группу "Русский Haskell".
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения,
> отправьте письмо на электронный адрес
> haskell-russi...@googlegroups.com.
> Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный
> адрес haskell...@googlegroups.com.
> Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке
> https://groups.google.com/d/msgid/haskell-russian/c2013d4d-cb35-4d00-b16d-3079fb2de294%40googlegroups.com.
> Чтобы настроить другие параметры, перейдите по ссылке
> https://groups.google.com/d/optout.

Maxim Taldykin

unread,
Jun 9, 2014, 2:39:58 PM6/9/14
to haskell...@googlegroups.com
Должно быть

fmap f (Point pointx pointy) = Point (f pointx) (f pointy)

Конструктор имеет тип Double -> Double -> Point a, а не (Double,
Double) -> Point a

Ну и замечание от Mike Potanin тоже абсолютно верное.


9 июня 2014 г., 22:36 пользователь Mike Potanin <mpot...@gmail.com> написал:
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу haskell...@googlegroups.com.
> Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/CAET_SyBS3ZMeZTX1TJHygeeWN%2BoL7%2Bir4aF59JHdL1oZvYZ8cQ%40mail.gmail.com.
> Настройки подписки и доставки писем: https://groups.google.com/d/optout.

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

unread,
Jun 9, 2014, 2:40:20 PM6/9/14
to haskell...@googlegroups.com
А поподробней можно? С кодом желательно.

Antonio Nikishaev

unread,
Jun 9, 2014, 2:40:37 PM6/9/14
to haskell...@googlegroups.com

On 9 Jun 2014, at 22:36, Mike Potanin <mpot...@gmail.com> wrote:

> Тип должен быть fmap :: (a -> b) -> Point a -> Point b для любых a и
> b, а не только для Double.

Он не на это ругается (но потом будет и на это, да)

instance Functor Point where
fmap f (Point pointx pointy) = Point (f pointx) (f pointy)

Нет никакого “Point (x, y)” (точнее есть, но оно совершенно не то)

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

unread,
Jun 9, 2014, 2:48:18 PM6/9/14
to haskell...@googlegroups.com
Couldn't match expected type `b' with actual type `Double'
    `b' is a rigid type variable bound by
        the type signature for fmap :: (a -> b) -> Point a -> Point b


Теперь я еще больше запутался :(

Maxim Taldykin

unread,
Jun 9, 2014, 2:58:56 PM6/9/14
to haskell...@googlegroups.com
9 июня 2014 г., 22:48 пользователь Евгений Золотарёв
<cosm...@gmail.com> написал:
Это то, о чём писал Михаил.
Типовый аргумент в Point у вас фейковый и определяемый вами fmap имеет
тип (Double -> Double) -> Point a -> Point b.
Нужно как-то поменять определение Point чтобы тип fmap поменялся на (a
-> b) -> Point a -> Point b.

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

unread,
Jun 9, 2014, 3:18:23 PM6/9/14
to haskell...@googlegroups.com
Может стоит исправить сам функтор?

Alexander V Vershilov

unread,
Jun 9, 2014, 3:21:10 PM6/9/14
to haskell...@googlegroups.com

Все же стоит исправить тип данных, т.к. мономорфный тип не может быть функтором.

В принципе тут хорошо бы ознакомиться с какое-нибудь базовой книгой или блогами. Конечно их можно пересказать здесь, но такой путь улучшит ваше понимание.

--
С уважением, Александр

On Jun 9, 2014 11:18 PM, "Евгений Золотарёв" <cosm...@gmail.com> wrote:
Может стоит исправить сам функтор?

--
Вы получили это сообщение, поскольку подписаны на группу "Русский Haskell".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес haskell-russi...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес haskell...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/haskell-russian/255f7f83-f6d9-4c95-919f-43939fc7f5f2%40googlegroups.com.

Артур Вельф

unread,
Jun 9, 2014, 3:29:24 PM6/9/14
to haskell...@googlegroups.com
Евгений, проблема в том, что у вас конструктор Point должен принимать два аргумента типа Double. А вы ему передаете лишь один аргумент типа Tuple (кортеж). 

Если входящие данные у вас в виде кортежа (т. е. в виде одного аргумента), то вы можете получить из него два требуемых вам аргумента, экстрагируя их из кортежа при помощи функций fst (pointx, pointy) и snd (pointx, pointy). 

Sent from iPad

9 июня 2014, в 21:31, "Евгений Золотарёв" <cosm...@gmail.com> написал(а):

--
Вы получили это сообщение, поскольку подписаны на группу "Русский Haskell".
Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес haskell-russi...@googlegroups.com.
Чтобы отправлять сообщения в эту группу, отправьте письмо на электронный адрес haskell...@googlegroups.com.
Чтобы посмотреть обсуждение на веб-странице, перейдите по ссылке https://groups.google.com/d/msgid/haskell-russian/c2013d4d-cb35-4d00-b16d-3079fb2de294%40googlegroups.com.

Mike Potanin

unread,
Jun 9, 2014, 3:32:26 PM6/9/14
to haskell...@googlegroups.com
data Point a = Point a a

instance Functor Point where
fmap f (Point x y) = Point (f x) (f y)

2014-06-09 23:21 GMT+04:00 Alexander V Vershilov
<alexander...@gmail.com>:
> https://groups.google.com/d/msgid/haskell-russian/CAO-1Pb6osPVDHzbAK9YPYrgMZRChWhSUEZ7E8-eYX3ScBNXRYA%40mail.gmail.com.

Maxim Taldykin

unread,
Jun 9, 2014, 4:39:46 PM6/9/14
to haskell...@googlegroups.com
9 июня 2014 г., 23:32 пользователь Mike Potanin <mpot...@gmail.com> написал:
> data Point a = Point a a
>
> instance Functor Point where
> fmap f (Point x y) = Point (f x) (f y)

data Point a = Point a a deriving Functor

Mike Potanin

unread,
Jun 10, 2014, 3:20:02 AM6/10/14
to haskell...@googlegroups.com
Это не спортивно ;-).

>
> --
> Вы получили это сообщение, поскольку подписаны на группу Русский Haskell.
>
> Чтобы отменить подписку на эту группу и больше не получать от нее сообщения, отправьте письмо на электронный адрес haskell-russi...@googlegroups.com.
> Чтобы добавлять сообщения в эту группу, отправьте письмо по адресу haskell...@googlegroups.com.
> Просмотреть это обсуждение в Сети можно по адресу https://groups.google.com/d/msgid/haskell-russian/CABxyK-nBaiTEmpjDDg829wvsgKE2Gp15S4SV20j5jraQ9-83oA%40mail.gmail.com.
Reply all
Reply to author
Forward
0 new messages