Haskell Report 2010 dice che seq
"indebolisce le proprietà parametricity di Haskell", come "⊥ non è lo stesso di \ x -> ⊥, dal momento ss può essere usato per distinguerli" [1].Perché il seq in Haskell deve avere una regola speciale per il fondo?
Sembra che accade esattamente a causa di una norma esplicita:
seq ⊥ b = ⊥
Mi chiedevo perché questo caso particolare è stato introdotto? Ci deve essere una ragione per la quale
seq a b = b
non sarebbe sufficiente, e seq
ha bisogno di una definizione più complicato con quel caso speciale:
seq ⊥ b = ⊥
seq a b = b, if a ≠ ⊥
[1] https://www.haskell.org/onlinereport/haskell2010/haskellch6.html#x13-1260006.2
[ modifica] Chiarifica la domanda, ecco un altro angolo su di esso. Perché non seq
può essere definito in questo modo:
seq :: a -> b -> b
seq a b = b
Con una regola che
seq
è una funzione speciale che valutare il suo primo argomento "il più possibile". Se la valutazione risulta in HNF, allora l'argomento è completamente valutato. Se risultasse in un'eccezione o un valore di fondo, questi sarebbero memorizzati e verrebbero lanciati o restituiti ogni volta che il primo argomento verrebbe effettivamente utilizzato nella valutazione del secondo argomento.
È un po 'zoppo, ma penso che dovrebbe rendere le mie domande un po' più chiare. Non si tratta di come funziona seq
. Riguarda le intenzioni del design attuale.
Forse ci sono alcune ovvie ragioni, dal punto di vista dell'implementazione. O forse avrebbe delle conseguenze, come l'incapacità di fornire alcune proprietà utili che sono attualmente basate sullo seq
stato definito con quel caso speciale per il fondo. O forse ci sono altre connessioni di cui non sono a conoscenza. Questo è quello che sto quirious circa :)
forse sono totalmente stupido qui ma il primo solo afferma il fatto che seq è severo nel primo argomento e questo è il punto in cui si usa seq in primo luogo (si valuta un HNF) – Carsten
(Per inciso, in realtà sembra essere una domanda aperta se '⊥' deve essere distinguibile da' \ x -> ⊥'. http://cstheory.stackexchange.com/questions/19165/is-eta-equivalence-for-functions-compatiable- with-haskells-seq-operation) –