Насколько я знаю, seq a b
оценивает (форсирует) a
и b
перед возвратом b
. Это не гарантирует, что a
оценивается первым.
pseq a b
сначала оценивает a
, затем оценивает/возвращает b
.
Теперь рассмотрим следующее:
xseq a b = (seq a id) b
Приложение-функция должно сначала оценить левый операнд (чтобы получить лямбда-форму), и оно не может слепо оценить правый операнд перед входом в функцию, потому что это нарушит нестрогую семантику Haskell.
Следовательно, (seq a id) b
должен сначала оценить seq a id
, что заставляет a
и id
(в каком-то неопределенном порядке (но оценка id
ничего не делает)), затем возвращает id b
(то есть b
); поэтому xseq a b
оценивает a
перед b
.
Является ли xseq
допустимой реализацией pseq
? Если нет, то что не так с приведенным выше аргументом (и возможно ли вообще определить pseq
через seq
)?
id
в формуseq a (\x->x)
, то он также увидит, что\x -> x
находится в WHNF, поэтомуseq a (\x->x)
можно "оптимизировать" доa
.pseq
фактически реализовано с точки зренияseq
иlazy
, которая является "глубоко волшебной" функцией идентификации, которую компилятор никогда не встраивает во время анализа строгости. - person user2407038   schedule 12.02.2017lazy
. - person Alec   schedule 12.02.2017seq a (\x->x)
вa
является ошибкой типа. Даже если он встраиваетid
, ему все равно придется возвращать\x->x
(и принудительноa
). Это именно то, чего я хочу, не так ли? - person melpomene   schedule 12.02.2017seq a (\x->x) b
может статьseq a ((\x->x) b)
- вообщеseq a y o
может статьseq a (y o)
, еслиy
находится в WHNF. Выполнит ли когда-нибудь компилятор такую оптимизацию, я не знаю, но определенно может. Я считаю, что с точки зрения «сырой операционной семантики» (т.е. делать вид, что компилятор вообще никогда не меняет ваш код) ваша функция правильная - она просто ломается при наличии оптимизаций. (действительно,lazy
денотационно равноid
- так что вашеxseq
денотационно равноpseq
, и обаseq
, только не операционно) - person user2407038   schedule 12.02.2017f x
должен сначала оценитьf
в WHNF, но это может быть не так. Если анализатор строгости окажетсяf
строгим, я думаю, что среда выполнения может сначала оценитьx
как WHNF без изменения семантики. Я не уверен, действительно ли это происходит в оптимизаторе GHC. - person chi   schedule 12.02.2017