id да не id

Apr 07, 2016 12:00

Приведите пример таких объявлений типа данных с конструктором данных T и сигнатуры функции f, что реализация

f (T x) = T x
проходила бы проверку типов, a

f x = x
нет.

fprog, haskell, сборник задач и упражнений по Хаскелю, fp

Leave a comment

Comments 15

orionll April 7 2016, 09:57:52 UTC
В голову приходит только дебильное:

data T = T (IO ())
instance Eq T where { _ == _ = True }

f = id

Теперь:

id $ putStrLn "abc" == putStrLn "abc" -- не компилируется
id $ T (putStrLn "abc") == T (putStrLn "abc") -- компилируется

Reply

orionll April 7 2016, 14:10:43 UTC
Короче, я неправильно понял задание. Я прочитал f x = x как f x == x и задача кардинально изменила свой смысл. Поэтому и написал instance Eq

Reply


migmit April 7 2016, 10:44:36 UTC
Ну, простейший вариант это data T = T Int Int. Или имеется в виду что-то другое?

Reply

migmit April 7 2016, 10:45:04 UTC
Даже нет, простейший - это data T = T.

Reply

orionll April 7 2016, 10:52:21 UTC
T x не скомпилируется. У T должен быть хотя бы один конструктор.

Reply

migmit April 7 2016, 10:58:06 UTC
Так, вроде ж, и не должно?

(полагаю, вы имели в виду "аргумент", а не "конструктор").

Reply


migmit April 7 2016, 11:07:28 UTC


data T a = T Int
f :: T Int -> T String
f (T a) = T a

Reply

deni_ok April 7 2016, 11:22:56 UTC
Ага, фантомы.

Reply


lomeo April 7 2016, 12:36:03 UTC
Хорошая задачка.

Reply


sassa_nf April 9 2016, 07:10:58 UTC
Вообще-то, из условия не очень понятно, что с такой ситуацией сталкивался. Как правило, ситуация возникает в каком-нибудь из кейсов - например:

map f (x:xs) = f x: map f xs
map f xs = xs -- нельзя, т.к. xs не того типа

А в чистом виде - функтор Const.

data Const a b = Const a
type T = Const A

Reply

deni_ok April 9 2016, 07:59:54 UTC
Первый шаг в решении, как мне кажется, состоит в том, чтобы прочувствовать, что аргумент и возвращаемое значение - один и тот же терм, который, однако, имеет два разных типа (иначе второе уравнение пройдет проверку). Ну а дальше думать, как заставить второе споткнуться на унификации, при том, что первое должно остаться устойчивым. Можно и без чистых фантомов решить, Either, например, подойдет.

Reply

sassa_nf April 9 2016, 08:36:47 UTC
ну да, ну да. Проблема с условием в том, что если попытаться выразить поточнее, получится почти ответ; а если так как есть, то не очень ясно, что именно нужно решить - тип функции :-)

Да, Either подойдет, но не пройдет проверку один из кейсов, и искомый вид имеет не вся функция, а лишь один кейс.

Reply


Leave a comment

Up