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] john kozlov (from livejournal.com) 2016-04-07 09:57 am (UTC)(link)
В голову приходит только дебильное:

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

f = id

Теперь:

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

[identity profile] migmit.livejournal.com 2016-04-07 10:44 am (UTC)(link)
Ну, простейший вариант это data T = T Int Int. Или имеется в виду что-то другое?

[identity profile] migmit.livejournal.com 2016-04-07 11:07 am (UTC)(link)
data T a = T Int
f :: T Int -> T String
f (T a) = T a

[identity profile] lomeo.livejournal.com 2016-04-07 12:36 pm (UTC)(link)
Хорошая задачка.

[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