Вывод типов всегда завершается, говорите?
Apr. 10th, 2007 02:31 pm![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Вот здесь у меня висит на выводе типа myFix:
Запускал в GHCi 6.6
newtype Fun a = Fun (Fun a -> a) fun x@(Fun f) = f x myFix = fun (Fun fun)
Запускал в GHCi 6.6
no subject
Date: 2007-04-10 03:37 pm (UTC)До завтра!
Не понял, почему
Date: 2007-04-11 06:42 am (UTC)Re: Не понял, почему
Date: 2007-04-11 08:24 am (UTC)Я имею в виду, что напрямую объявить Y комбинатор в Haskell нельзя - там тип получается бесконечный. Но если мы сделаем безтиповую лямбду (как в примере
Re: Не понял, почему
Date: 2007-04-11 08:44 am (UTC)В конце концов, я ничего в твоем примере не изменил, кроме определения myfix.
Кстати, ты не надумал запостить куда-нибудь баг-репорт? Как бы там ни было, а компилятор виснуть не должен.
Re: Не понял, почему
Date: 2007-04-11 09:18 am (UTC)Это неважно, 'a' нужно лишь на нижнем уровне, когда мы применяем fix. selfApply и myfix - это же явно бестиповое использование (параметризуем Fun нужным значением, и получаем бестиповую лямбду).
> Кстати, ты не надумал запостить куда-нибудь баг-репорт? Как бы там ни было, а компилятор виснуть не должен.
Я пробовал как то писать на haskell мейл листы, у меня не проходило почему то письмо. Уходило - да, а затем как в омут. хз.
Re: Не понял, почему
Date: 2007-04-11 09:31 am (UTC)Не уверен, что понимаю, что ты хочешь сказать. Бестиповая лямбда имеет тип (Untyped -> Untyped) as Untyped, из нее невозможно получить список или число, а из Fun a - можно.
Тип бестипового лямбда-выражения можно выразить с помощью рекурсивных типов, но это не означает, что любое применение рекурсивных типов равносильно отсутствию типов. Тайп-чекер замечательно контролирует типы при работе со списками, типы f и n в теле функции факториала тоже определены.
>Я пробовал как то писать на haskell мейл листы, у меня не проходило почему то письмо. Уходило - да, а затем как в омут. хз.
У меня получалось, я могу попробовать.
Re: Не понял, почему
Date: 2007-04-11 10:01 am (UTC)Неважно. Я имел в виду, что Fun (Fun a -> a) эмулирует бестиповую лямбду, т.е. на нём можно сделать всё, что можно сделать на бестиповой лямбде. А 'a' тут есть или нет - роли не играет.
> У меня получалось, я могу попробовать.
Давай!
Re: Не понял, почему
Date: 2007-04-11 10:14 am (UTC)\x -> x x
?
myfix (\x -> x x) даст ошибку типизации. Или мы саму лямбду здесь должны делать по-другому?
Re: Не понял, почему
Date: 2007-04-11 10:33 am (UTC)Re: Не понял, почему
Date: 2007-04-11 11:24 am (UTC)Re: Не понял, почему
Date: 2007-04-11 11:33 am (UTC)Re: Не понял, почему
Date: 2007-04-11 08:40 am (UTC)Re: Замечание
Date: 2007-04-11 08:50 am (UTC)Re: Замечание
Date: 2007-04-11 09:30 am (UTC)Там действительно вместо (Untyped x) будет матчиться x wrapped типа, значит undefined просто не будет выполнен.
Надо запомнить - pattern matching для newtype ленив, если он в виде (C a) ;-)
Re: Не понял, почему
Date: 2007-04-11 10:11 am (UTC)никогда в голову не помещались! Моск уходил в бесконечную рекурсию.
Получается, типы навроде Fun a = Fun (Fun a -> a) как раз для того всегда и делаются, чтоб обмануть тайпчекер?
Re: Не понял, почему
Date: 2007-04-11 10:37 am (UTC)Re: Не понял, почему
Date: 2007-04-11 10:49 am (UTC)Ковариантный - это что-то из теормеха?
Re: Не понял, почему
Date: 2007-04-11 11:35 am (UTC)Честно, это не я придумал :-)
Re: Не понял, почему
Date: 2007-04-11 12:20 pm (UTC)Мощно завернул!
Date: 2007-04-11 11:06 am (UTC)По моему разумению, о ко(контра)вариантности можно говорить только при наличии subtyping между типами аргументов или результата.
Всего лишь повторил мощно завернутое ;-)
Date: 2007-04-11 11:52 am (UTC)Re: Всего лишь повторил мощно завернутое ;-)
Date: 2007-04-11 12:23 pm (UTC)А названием источника или даже ссылкой не поделишься?
Я описание ко- и контра- вариантности видел в TAPL и в статьях Карделли, там все просто и прозрачно - вводится отношение subtyping (как по-русски? "подтипизация"?) между функциями при наличии subtyping между типами аргумента и результата:
a -> b <: a' -> b', если a' <: a и b <: b'
Re: Всего лишь повторил мощно завернутое ;-)
Date: 2007-04-11 12:38 pm (UTC)