일반적인 Haskell 연산자에 대한 명확한 이름이 있습니까? [닫은]


204

나는 당신 에게 Great Good을위한 Haskell을 배우고 있으며, Haskell 연산자를 발음하는 법을 결코 모른다. "실제"이름이 있습니까? ?

예를 들어, 이런 식을 어떻게 소리내어 읽습니까?

Just (+3) <*> Just 9

나는 그것이 >>="바인드" 라는 것을 알고 있지만, 다른 사람들은 어떻습니까? Google은 영숫자가 아닌 문자를 고려하지 않기 때문에 효율적인 검색을 수행하기가 어렵습니다 ...

나는 당신이 자신의 연산자를 만들 수 있다는 것을 알고 있습니다. 물론 모든 연산자가 이름을 가질 수는 없지만 일반적인 연산자 (예 : Applicative또는에 정의 된 연산자 Monad)에는 이름이 있어야합니다 ...


좋은 질문이며 답을 알지 못합니다. 아마도 이름 지정 체계가 필요하거나 라이브러리 작성자가 Haddock 문서의 일부로 발음 할 수있는 이름을 제공해야합니다.
Paul Johnson

3
아주 좋은 질문입니다. 일반적으로 <*>는 "apply"로, <$>는 "fmap"으로 읽습니다. 다른 사람들에 대해서는 전혀 모른다.
DuoSRX

3
이것은 "Haskell : How <*>발음?" 의 복제본 입니까? ? 그렇지 않은 경우에도 답변을 확인하는 것이 좋습니다.
Antal Spector-Zabusky

8
또한, Haskell 위키의 발음 페이지를 확인하십시오 . 불완전하지만 관련성이 있습니다.
Antal Spector-Zabusky

3
()단위가 발음됩니다. 한때 나는 내 슬라이드에서 그것을 발음하는 방법을 모르는 수백 명의 기능 프로그래머의 청중 앞에서 내 자신을 고집했다.
sigfpe

답변:


194

내가 그들을 발음하는 방법은 다음과 같습니다.

>> = 바인드
>> 그때
*> 그런 다음
->에서                 a- > b : a에서 b 
<-바인드              
<$> (f) 맵
<$ map-replace by     0 <$ f : "f map-replace by 0" 
<*> ap (ply)            (Control.Monad.ap와 동일) 
$                          (없음, ""[공백]과 동일 ) 
. 에 파이프            . b : "b 파이프 투 a"
!! 인덱스
! 색인 / 엄격한     ! b : "인덱스 b", foo! x : foo strict x 
<|> 또는 대체   expr <|> 용어 : "expr 또는 term"
++ concat / plus / append
[] 빈 목록
: 단점
:: / 유형의       fx :: Int : 유형의 Int fx
람다
@ as                 go ll @ (l : ls) : l ll as l cons ls 
~ lazy               go ~ (a, b) : go lazy pair a, b

100
나에게 (.)"구성"입니다.
luqui

47
나는 보통 (.)as of($)as를 발음 한다 applied to: f . g . h $ x그러므로 읽힌다 f of g of h applied to x. 그러나 나는이 관점에서 차이를 이해한다!
Ptival

39
(.)"후" 로 발음 하는 것이 더 합리적 이라고 생각 합니다. 컴포지션은 두 방향으로 표시 될 수 있으며 "후"라고 부르면 그 작동 방식도 즉시 설명합니다.

1
@Tinctorius의 구성은 컴포지션 이후인지 또는 이전인지에 따라 보편적이지 않은 관점에 달려 있습니다. 예를 들어에서에서 무한 루프 "후" const 42 . fix id라고 말할 수 const 42있습니까?
luqui

7
Haskell에 이미있는 것이기 때문에 유틸리티가 매우 다르기 때문에 ++대신 "append"를 호출 합니다. concatconcat
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
답변 주셔서 감사합니다. "달러 사이클롭스"는 나를 웃게했다 :)
Thomas Levesque

9
Cyclops 는 단수이므로 s 를 삭제할 필요가 없습니다 . :)

1
무엇에 대해 <*? 거의 사용되지 않아서 일반적인 이름이 없습니까?
Dannyu NDos


8

나는 패턴 매칭을 통해서만 하스켈 코드를 영어로 번역하려고 시도하는 매우 간단한 하스켈 프로그램으로 답을 모으기 위해 자유를 얻었습니다. letterator기호를 문자로 변환하기 때문에 호출합니다.

-- 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
이 사람은 아주 분명하다 ... 내 질문은 같은 특이한 운영자에 대한했다 <*>, >>...
토마스 레베

20
완전성을 위해.
Thomas Eding
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.