4 Stimmen

Die Erstellung einer Infix-Funktion

Ich kann eine Funktion wie diese definieren

method1 :: Int -> Int -> Int
method1 a b = a + b

main = print $ 1 `method1` 2

Was ist, wenn ich nicht jedes Mal `` verwenden möchte, wenn ich die Funktion aufrufe, aber dennoch die Infix-Form nutzen möchte, wie mache ich das?

method1 :: Int -> Int -> Int
method1 a b = a + b

main = print $ 1 method1 2

9voto

Daniel Gratzer Punkte 52205

Nun, die kurze Antwort ist, dass man es nicht kann. Stellen Sie sich die schreckliche Mehrdeutigkeit mit a b c vor, wenn b potenziell infix ist. Aber Sie können einen Operator definieren, der dies für Sie tut. Jeder der folgenden wird funktionieren

a |+| b   = Methode1
(|+|) a b = Methode1 a b 
(|+|)     = Methode1

Dann

a |+| b === a `Methode1` b === Methode1 a b

Die zulässigen Zeichen für Haskell-Infix-Operatoren sind begrenzt, wählen Sie aus

:|!@#$%^&*-+./<>?\~

Ein häufiges Bibliothek, Lens, hat viele Operatoren, die als Synonyme für längere Namen fungieren. Es ist ziemlich üblich. Bitte nutzen Sie jedoch Ihr Urteilsvermögen, sonst landen Sie eher mit Perl als mit Haskell :)

2voto

David Miani Punkte 14378

Es gibt eine abscheuliche und böse "Lösung" dafür - die Verwendung eines CPP-Makros. Z.B.:

{-# LANGUAGE CPP #-}

#define method1 `themethod`
module Main where

themethod x y = x + y

someValue = 3 method1 4

Dieses kompiliert und in ghci wird someValue gleich 7 sein. Bitte machen Sie das jedoch nicht...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X