deniok: (typed lambda)
[personal profile] deniok
Вернёт ли вызов f "False" что-нибудь и, если вернёт, то что?
f (~ t : ~ r : ~ u : ~ "e") = (:) r $ (:) u [u]


PS. Под замком - чтобы студенты не видели, потом сниму.

UPD. Вынес из-под замка.

Date: 2011-10-19 07:39 pm (UTC)
From: [identity profile] thesz.livejournal.com
Это былоллегко. ;)

Date: 2011-10-19 07:48 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Это такая разминка - после теории перед практикой для закрепления пройденного.

Date: 2011-10-20 07:29 pm (UTC)
From: [identity profile] udpn.livejournal.com
Мда, какого говна только не засунут в нормальный язык. Из того, что это используется для предотвращения pattern matching being done too early, я не понял ничего.

А вообще ответ ясен даже без знания семантики тильд. Я специально проверил.

Date: 2011-10-20 07:52 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Рассмотрим оператор
(***) f g ~(x, y) = (f x, g y)
Вызов
Prelude> (const 1 *** const 2) undefined
(1,2)
возвращает то, что хотелось бы. Без ленивого образца результат был бы "менее определен" без особых на то оснований.

Date: 2011-10-20 08:01 pm (UTC)
From: [identity profile] udpn.livejournal.com
Внезапно, читая это с дополнительным гуглингом, наткнулся на то же самое определение.
Честно говоря, я не очень понимаю, почему в ленивом языке вообще может произойти такая фигня, как
(***) f g (x, y) = (f x, g y)
(const 1 *** const 2) undefined ->> undefined

(ну PM против undefined. кто вообще придумал синтетическое правило, что он должен произойти со всеми аргументами?),
и зачем для её разрешения была введена ещё более синтетическая конструкция.

Date: 2011-10-20 08:04 pm (UTC)
From: [identity profile] udpn.livejournal.com
То, что PM нужно использовать со всем образцом, может быть полезно где-нибудь при сравнении с несколькими аргументами, где типы аргументов — ADT с несколькими конструкторами.

Но при сравнении с (,) ведь других вариантов нет, это единственный конструктор данных для этого типа.

Date: 2011-10-20 08:11 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
f (7,_) = 42
f (_,_) = 13

Date: 2011-10-20 08:21 pm (UTC)
From: [identity profile] udpn.livejournal.com
А, здесь так дилемма: иметь практичную конструкцию или быть нацистом теории. Понятно.

Date: 2011-10-20 08:29 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
Не понял тезиса. Любой PM по умолчанию энергичен, это и есть "практичная конструкция", годная в over 9000 случаев. Хочешь ленивого матча - используй ленивый образец, либо связывай переменной, а не образцом пары:
(***) f g p = (f $ fst p, g $ snd p)

Date: 2011-10-20 08:06 pm (UTC)
From: [identity profile] deni-ok.livejournal.com
> почему в ленивом языке вообще может произойти такая фигня,

Потому что PM энергично разбирает thunk, проверяя какой там конструктор данных использован; иначе невозможно было бы выбрать, что сработает:
f (x:xs) = ...
f []     = ...

Profile

deniok: (Default)
deniok

February 2022

S M T W T F S
  12345
6789101112
13141516171819
20212223 242526
2728     

Style Credit

Expand Cut Tags

No cut tags
Page generated Sep. 4th, 2025 06:53 am
Powered by Dreamwidth Studios