2015-12-05 17 views
11

Ad esempio, questo non digitare controllareCome dare infissi agli operatori in lambda?

\cons nil -> 5 `cons` 3 `cons` nil 

né fa

\(#) -> 5 # 3 # nil 

Sebbene entrambi questi fanno

\cons nil -> 5 `cons` nil 
\(#) nil -> 5 # nil 

C'è un modo per assegnare infixites agli operatori in lambda . Ho provato

infixr 5 # 
foo = \(#) nil -> 5 # 3 # nil 

che dà un errore per una definizione di # e

foo = \(infixr 5 #) nil -> 5 # 3 # nil 

che è solo un errore di sintassi.

Cosa posso fare?

risposta

16

dichiarazioni fissità possono essere locali ma devono accompagnare le definizioni, in modo che avrebbe dovuto scrivere qualcosa di simile

foo cons nil = 'a' # 'b' # nil 
    where (#) = cons 
     infixr 5 # 

o

foo = \cons nil -> let (#) = cons; infixr 5 # in 'a' # 'b' # nil 

ecc

+4

bello davvero! Questa parte di Haskell98, Haskell2010 o semplicemente GHC? – leftaroundabout

+1

Mi piace soprattutto la versione let. – PyRulez

+1

È Haskell 98. La sintassi di let e where coinvolge "decli", che include le firme di tipo, le dichiarazioni di fissità e le associazioni di funzioni e schemi. –