deniok: (ухмыляюсь)
deniok ([personal profile] deniok) wrote2016-04-07 12:00 pm

id да не id

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

[identity profile] sassa-nf.livejournal.com 2016-04-09 07:10 am (UTC)(link)
Вообще-то, из условия не очень понятно, что с такой ситуацией сталкивался. Как правило, ситуация возникает в каком-нибудь из кейсов - например:

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

[identity profile] deni-ok.livejournal.com 2016-04-09 07:59 am (UTC)(link)
Первый шаг в решении, как мне кажется, состоит в том, чтобы прочувствовать, что аргумент и возвращаемое значение - один и тот же терм, который, однако, имеет два разных типа (иначе второе уравнение пройдет проверку). Ну а дальше думать, как заставить второе споткнуться на унификации, при том, что первое должно остаться устойчивым. Можно и без чистых фантомов решить, Either, например, подойдет.

[identity profile] sassa-nf.livejournal.com 2016-04-09 08:36 am (UTC)(link)
ну да, ну да. Проблема с условием в том, что если попытаться выразить поточнее, получится почти ответ; а если так как есть, то не очень ясно, что именно нужно решить - тип функции :-)

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