Gibt es aussprechbare Namen für gängige Haskell-Operatoren? [geschlossen]


204

Ich lese Learn You a Haskell for Great Good und weiß nie, wie man die Haskell-Operatoren ausspricht. Haben sie "echte" Namen? ?

Wie liest man zum Beispiel einen Ausdruck wie diesen vor?

Just (+3) <*> Just 9

Ich weiß, dass >>=das "binden" ist, aber was ist mit den anderen? Da Google nicht alphanumerische Zeichen nicht berücksichtigt, ist es schwierig, eine effiziente Suche durchzuführen ...

Mir ist klar, dass Sie Ihre eigenen Operatoren erstellen können, daher können natürlich nicht alle Operatoren Namen haben, aber ich gehe davon aus, dass die gemeinsamen (z. B. die in Applicativeoder definierten Monad) Namen haben müssen ...


Es ist eine gute Frage, und mir sind keine Antworten bekannt. Vielleicht brauchen wir ein Namensschema, oder vielleicht sollten Bibliotheksautoren aussprechbare Namen als Teil von Haddock-Dokumenten bereitstellen.
Paul Johnson

3
Sehr gute Frage. Normalerweise lese ich <*> als "anwenden" und <$> als "fmap". Was die anderen betrifft, habe ich keine Ahnung.
DuoSRX

3
Ist das ein Duplikat von "Haskell: Wie wird es <*>ausgesprochen?" ? Auch wenn dies nicht der Fall ist, sind die Antworten wahrscheinlich einen Blick wert.
Antal Spector-Zabusky

8
Schauen Sie sich auch die Ausspracheseite des Haskell-Wikis an . Es ist unvollständig, aber relevant.
Antal Spector-Zabusky

3
()wird Einheit ausgesprochen. Einmal saß ich vor einem Publikum von ein paar hundert funktionalen Programmierern fest, die nicht wussten, wie man das auf meiner Folie ausspricht.
Sigfpe

Antworten:


194

So spreche ich sie aus:

>> = binden
>> dann
*> dann
-> zu                 a -> b: a zu b 
<- binden               (wie es zu >> = desugiert)
<$> (f) Karte
<$ map-replace by     0 <$ f: "f map-replace by 0" 
<*> ap (ply)            (wie es mit Control.Monad.ap identisch ist) 
$                          (keine, nur als "" [Leerzeichen] ) 
. Rohr zu            einem. b: "b Pipe-to-a"
!! Index
! Index / streng     a! b: "a index b", foo! x: foo strict x 
<|> oder / alternativer   Ausdruck <|> Begriff: "Ausdruck oder Begriff"
++ concat / plus / append
[] leere Liste
: Nachteile
:: vom Typ / als       fx :: Int: fx vom Typ Int
\ lambda
@ as                 go ll @ (l: ls): go ll as l cons ls 
~ faul               go ~ (a, b): go faul Paar a, b

100
ist für mich (.)"komponieren".
Luqui

47
Ich spreche normalerweise eher (.)als ofund ($)als applied to: f . g . h $ xwird daher gelesen f of g of h applied to x. Aber ich verstehe Divergenz in dieser Hinsicht!
Ptival

39
Ich denke, es (.)ist sinnvoller, als "nach" auszusprechen . Die Komposition kann in zwei Richtungen bezeichnet werden, und wenn man sie "nach" nennt, wird sofort erklärt, wie sie auch funktioniert.

1
@Tinctorius, ob Komposition nach oder vor ist, hängt von einer Sichtweise ab, die nicht universell ist. Können const 42 . fix idwir zum Beispiel in wirklich sagen, dass const 42eine Endlosschleife "nach" kommt?
Luqui

7
Ich würde ++stattdessen "Anhängen" nennen concat, da dies concatin Haskell bereits eine Sache ist und das Dienstprogramm sehr unterschiedlich ist.
Benjamin Kovach

42
| sym  | pronunciation                                    |
|------|--------------------------------------------------|
| |    | "such that"                                      |
| <-   | "is drawn from"                                  |
| =    | "is defined to be" / "is defined as"             |
| ::   | "has type" / "of type" / "is of type"            |
| ->   | "a function that takes ... and returns a ..." /  |
|      |                          "function that maps" /  |
|      |                          "is a function from" /  |
|      |                                          "to"    |
| $    | "apply"                                          |
| _    | "whatever"                                       |
| !!   | "index"                                          |
| ++   | "concat"                                         |
| []   | "empty list"                                     |
| :    | "cons"                                           |
| \    | "lambda"                                         |
| =>   | "implies" / "then"                               |
| *>   | "then"                                           |
| <$>  | "fmap" / "dollar cyclops"                        |
| <$   | "map-replace by"                                 |
| <*>  | "ap" / "star cyclops"                            |
| .    | "pipe to" / "compose" / "dot"                    |
| <|>  | "or"                                             |
| @    | "as"                                             |
| ~    | "lazy"                                           |
| <=<  | "left fish"                                      |

2
Danke für deine Antwort. "Dollar Cyclop" brachte mich zum Lachen :)
Thomas Levesque

9
Cyclops ist einzigartig, Sie müssen das s nicht fallen lassen . :)

1
Was ist mit <*? Wird es so selten verwendet, dass es keinen gemeinsamen Namen hat?
Dannyu NDos


8

Ich habe mir erlaubt, die Antworten zu einem sehr einfachen Haskell-Programm zusammenzufassen, das nur durch Mustervergleich versucht, Haskell-Code ins Englische zu übersetzen. Ich nenne es, letteratorweil es Symbole in Buchstaben übersetzt

-- letterator

main = translateLn <$> getLine >>= putStrLn

translateLn :: String -> String
translateLn = unwords . map t . words

t :: String -> String -- t(ranslate)

-- historical accurate naming
t "=" = "is equal too" -- The Whetstone of Witte - Robert Recorde (1557)

-- proposed namings
-- src http://stackoverflow.com/a/7747115/1091457
t ">>=" = "bind"
t "*>"  = "then"
t "->"  = "to"                   -- a -> b: a to b
t "<$"  = "map-replace by"       --  0 <$ f: "f map-replace by 0"
t "<*>" = "ap(ply)"              --  (as it is the same as Control.Monad.ap)
t "!!"  = "index"
t "!"   = "index/strict"         --  a ! b: "a index b", foo !x: foo strict x
t "<|>" = "or/alternative"       -- expr <|> term: "expr or term"
t "[]"  = "empty list"
t ":"   = "cons"
t "\\"  = "lambda"
t "@"   = "as"                   -- go ll@(l:ls): go ll as l cons ls
t "~"   = "lazy"                 -- go ~(a,b): go lazy pair a, b
-- t ">>"  = "then"
-- t "<-"  = "bind"              -- (as it desugars to >>=)
-- t "<$>" = "(f)map"
-- t "$"   = ""                  -- (none, just as " " [whitespace])
-- t "."   = "pipe to"           -- a . b: "b pipe-to a"
-- t "++"  = "concat/plus/append" 
-- t "::"  = "ofType/as"         -- f x :: Int: f x of type Int

-- additional names
-- src http://stackoverflow.com/a/16801782/1091457
t "|"   = "such that"
t "<-"  = "is drawn from"
t "::"  = "is of type" 
t "_"   = "whatever"
t "++"  = "append"
t "=>"  = "implies"
t "."   = "compose"
t "<=<" = "left fish"
-- t "="   = "is defined as"
-- t "<$>" = "(f)map"

-- src http://stackoverflow.com/a/7747149/1091457
t "$"   = "of" 

-- src http://stackoverflow.com/questions/28471898/colloquial-terms-for-haskell-operators-e-g?noredirect=1&lq=1#comment45268311_28471898
t ">>"  = "sequence"
-- t "<$>" = "infix fmap"
-- t ">>=" = "bind"

--------------
-- Examples --
--------------

-- "(:) <$> Just 3 <*> Just [4]" 
-- meaning "Cons applied to just three applied to just list with one element four"
t "(:)"  = "Cons"
t "Just" = "just"
t "<$>"  = "applied to"
t "3"    = "three" -- this is might go a bit too far
t "[4]"  = "list with one element four" -- this one too, let's just see where this gets us

-- additional expressions to translate from
-- src http://stackoverflow.com/a/21322952/1091457
-- delete (0, 0) $ (,) <$> [-1..1] <*> [-1..1]
-- (,) <$> [-1..1] <*> [-1..1] & delete (0, 0)
-- liftA2 (,) [-1..1] [-1..1] & delete (0, 0)
t "(,)" = "tuple constructor"
t "&" = "then" -- flipped `$`

-- everything not matched until this point stays at it is
t x = x

4
+      plus
-      minus (OR negative OR negate for unary use)
*      multiply OR times
/      divide
.      dot OR compose
$      apply OR of

12
Diese hier sind recht offensichtlich ... Meine Frage war über die ungewöhnlicheren Operatoren wie <*>, >>...
Thomas Levesque

20
Zur Vollständigkeit.
Thomas Eding
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.