2015-12-05 8 views
11

Zum Beispiel dies nicht gebenWie man Operatoren in Lambda Infixitäten geben kann?

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

noch tut dies

\(#) -> 5 # 3 # nil 

Obwohl beide

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

ein Weg infixites an Betreiber in lambda Gibt es nicht überprüfen zuweisen . Ich habe versucht,

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

, die für keine Definition von # und

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

einen Fehler gibt, die nur ein Syntaxfehler ist.

Was kann ich tun?

Antwort

16

Unveränderlichkeit Erklärungen können lokal sein, sondern müssen Definitionen begleiten, so würden Sie so etwas wie

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

oder

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

usw.

+4

Nizza in der Tat zu schreiben! Ist das ein Teil von Haskell98, Haskell2010 oder nur GHC? – leftaroundabout

+1

Ich mag besonders die Let-Version. – PyRulez

+1

Es ist Haskell 98. Die Syntax von let und where beinhaltet "decls", was Typensignaturen, Fixity-Deklarationen und Funktions- und Musterbindungen einschließt. –