하스켈 자습서는 책임질래 표기법 가르치는 대부분의 사용을 위한 입출력 (i / o).
난 또 내 코드 같은 언어를 사용하여 시작된 책임질래 표기법 있지만, 더 이상 볼 수 있는 필수적인 욕금지 fp
이번 주 사용하여 입출력 (i / o) 을 (를) ',' 내가 본 자습서는 $ > <.
stringAnalyzer <$> readFile "testfile.txt"
사용하는 대신 지향하는 '
main = do
strFile <- readFile "testfile.txt"
let analysisResult = stringAnalyzer strFile
return analysisResult
및 로그 분석 도구는 지향하는 '없이 마쳤다.
그래서 내 질문은 피할 경우., 책임질래 표기법 믿지아니하며 " " 하는가?
어쩌면 '코드' 발쿰치로 그러니까말이야 못하며창조된 더 나은 경우도 있습니다.
제 생각에는 ',' 와 ',' 는 $ > <, FP 코드를 더 이상 *> <, 입출력 (i / o).
아주 간단한 방법 '에서' 할 수 있는 표기법을 하스켈 데슈거스.
do
x <- foo
e1
e2
...
바뀝니다
foo >>= \x ->
do
e1
e2
및
do
x
e1
e2
...
agent.
x >>
do
e1
e2
....
즉, 모든 계산을 할 수 있는 '모나드 > >; = 정말 쓰기' 와 '반환'. 단 하나의 이유는 우리가 왜 don& # 39, t, s # 39 더 아픈 구문을 그냥 it& 있기 때문이다. 모나드, '코드' 는 것처럼 보여야 할 때 유용합니다 반드시 이 표기법을 비난한다.
이 캜 쯤 구문을 훨씬 더 쉽게 이해할 수 있어 초보자도 거잖나. # 39, re right, t look it doesn& you& 있지만, 누군가 그로크 제대로 작동하는 # 39 모나드를 전에 필요한 IO 가 꽤 큰 억지력을 사용할 수 있습니다.
마지막으로 두 연산자 봤어요;;;; ',' 와 ',' < $ > < *> 프마프 및 실용적 아니라 실제로 각각 모나드. 그들은 실제로 사용될 can& t # 39 는 무엇을 나타내기 위해, 많은 표기법. # 39, re they& 확인할 수 있지만, t # 39 더 컴팩트형 don& 쉽게 이름을 사용하면 중간 값. 개인적으로 약 80% 의 시간 동안 내가 주로 쓰기 때문에 이를 사용하는 경향이 있는 아주 작은 작성 가능 함수 애니웨이 실용적 적합합니다.
>. 제 생각에는 ',' 와 ',' 는 $ > <, FP 코드를 더 이상 *> <, 입출력 (i / o).
순수한 함수형 언어가 아닌 것 같은데, 하스켈, better" " 있기 때문이다. # 39, 많은 경우에 있어, 가끔 않니다 doesn& 없다. 그러나 그 이유 없는 무 (無) 기능 semantics 사용하고 있다. It 가 우리에게 훨씬 더 쉽게 증명할 수 있도록 하는 갖추고있다 참조 투명도로 매우 높은 수준의 최적화, 불변량 쉽게 쓸 수 있는 범용 코드 상술합니다.
이 중 어느 것도 구문을 사용하여 많은 일을 할 수 있다. 모나드 계산에 상관 없이 여전히 순수한 기능 '을 (를)', '표기법 또는 $ > < 못하며창조된 작성하든지 그들과 함께 쓰기', ',' 와 '> > *> <;;; =' 우리 haskell& # 39 의 장점 때문에 어느 쪽이든.
그러나 앞서 언급한 fp 보험급부금 불구하고 흔히 생각하는 알고리즘 보다 직관적인 같은 명령형 관점 - # 39 에서 you& 경우에도, re 익숙한 통해 이것이 어떻게 구현됩니까 모나드를. 이 경우 '의 표기법을 사용하면 못하며창조된' 이 빠른 insight, order of origin of data" ";;;, " " computation" 집중식으로 modification" 아직;; s # 39 를 수동으로 데거 it in your head '사소한 it& > >; =' 버전, 상황을 잘 이루기 위해 what& # 39, 기능적으로.
실용적 스타일입니까 확실히 멋지구리해요 여러모로 하지만 본질적으로 포인트 무료. 좋은 일 때, 특히 쓰는 것이 더 복잡한 문제에 매우 유용할 수 있습니다 전달자로써 이름을 " temporary"; 변수. 만 사용할 때 " FP"; 하스켈 또는 명시적으로 인컨텍스트 구문, 이를 위해서는 람다 release. 총괄하였습니다. 하지만 둘 다 좋은 활용 사례 코드에 아주 조금 전 cxp 소음입니다 오른쪽 중간에 방해 및 rmw 대답하도다 이 " flow"; 여기서 '또는' let '다른 곳에 배치된 이후 필요합니다' from where you use it. 반면, '할 수 있습니다' 라는 변수를 전혀 유발하지 않으면서 소음입니다 필요한 곳에, 오른쪽 했다.
제가 자주 쓰는 표기법 '액션' 모나드 먼저 내 자신을 찾을 못하며창조된 어졌다면 리팩토링 it down 단순한 모나드 (또는 펑스리아르) 표현식입니다. 이런 때 할 수 있다 '' 블록 알고보니 제가 걱정했던것 짧은 편이다. 때때로 나는 반대 방향으로 리팩터링. 문제가 있는 코드를 따라 다릅니다.
My general rule) 은: '할 경우, 대개 긴 s 라인' 은 불과 몇 블록 it& # 39 로 깔끔한 파선-짧은 표현식입니다. '는' 블록 읽을 수 있기 때문에, 아마 더 오래 할 수 있는 방법을 찾을 수 없으면 더 작고, break it up) 를 작성 가능 총괄하였습니다.
예를 들어, 우리가 어떻게 혁신할 수 있는 세부 비호환성의 협력했습니다 here& # 39 의 코드 스니핏 를 단순합니다.
main = do
strFile <- readFile "testfile.txt"
let analysisResult = stringAnalyzer strFile
return analysisResult
첫째, 최근 2 선이 있는 것을 볼 수 있는 'x' x = y 자 형태로 보상으론. 물론 단순히 'y' 이 복귀하십시오 변환할 수 있다.
main = do
strFile <- readFile "testfile.txt"
return (stringAnalyzer strFile)
이것은 매우 짧은 지향하는 '요소: 우리는 ',' 을 이름, 뭔가 재동기화할 testfile.txt" 바인딩해야 ", 참고: 윈도우즈에서 동작하지 않습니다.) 에서 그 이름이 바로 다음 할말이다 # 39, & # 39 의 let& 시도하시겠습니까 de-sugaring& # 39. 마치 컴파일러에서:
main = readFile "testFile.txt" >>= \strFile -> return (stringAnalyser strFile)
람다 (λ) 양식 보면 오른쪽에 '> >; ='. # 39 의 기도하나요 스크램블된 it& 로 다시 포인트 무료 스타일: '\x >. f, g 가 \x > $ x '-' (f. g) '즉' f (x). g '.
main = readFile "testFile.txt" >>= (return . stringAnalyser)
이것은 이미 많이유 깔끔한 역어셈블리는 원본 지향하는 '블록, 하지만 우리는 좀 더 발전할 수 있습니다.
main = fmap stringAnalyser (readFile "testFile.txt")
마지막으로, '그냥', '는 또 다른 방법은 단 <, $ > 먹어서나 프마프'.
main = stringAnalyser <$> readFile "testFile.txt"
이 버전은 원래 코드로) 보다 많은 것 같아요. 같은 문장을 읽을 수 있습니다. ", '주' 는 ',', ',' 결과를 판독값 " testFile.txt" " 스트린가나라이저 적용됩니다. 원래 버전간의 습지 운영에 대한 자세한 내용은 아래 절차적 있습니다.
부록: # 39, & # 39 는 모든 모나드를 functors& 내 설명을. 할 수 있는 사실을 어딜가던지 >; = (귀의하노라 > 대답하도다 의해 자리맞춤 수 f) ' (lc-fc library& 라이프트만 # 39 의' 표준 ') 는 동일합니까 프마프 f' m '. 인스턴스입니다 경우 '모나드 함자' & # 39 의 ',' 확보하십시오 인스턴스입니다 free& # 39. - 그냥 정의하십시오 프마프 라이프트만 '='! # 39 의 인스턴스를 해당 유형 '정의' 의 경우 someone& 모나드 함자 '와' 실용적 '가 아닌 "에 대한 인스턴스입니다 i& # 39, d, 그 외의 버그가. '방법' 의 '모나드 함자 작성되지는 클라이언트를 사용할 수 있는' 인스턴스들도 없이 너무 귀찮아.
>. 어떤 경우든 책임질래 표기법 피할 하는가?
do
f <- [(+1), (*7)]
i <- [1..5]
return $ f i
여러 가지 않는 수축됐는데 지향하는 '표기법 발쿰치로 코드를 사용하여 매우 읽을 수 없습니다. [이 예] 고려해보십시오 (https://en.wikibooks.org/wiki/Haskell/do_Notation # Example:_user-interactive_program):
nameDo :: IO ()
nameDo = do putStr "What is your first name? "
first <- getLine
putStr "And your last name? "
last <- getLine
let full = first++" "++last
putStrLn ("Pleased to meet you, "++full++"!")
name :: IO ()
name = putStr "What is your first name? " >>
getLine >>= f
where
f first = putStr "And your last name? " >>
getLine >>= g
where
g last = putStrLn ("Pleased to meet you, "++full++"!")
where
full = first++" "++last
또는 같은
nameLambda :: IO ()
nameLambda = putStr "What is your first name? " >>
getLine >>=
\first -> putStr "And your last name? " >>
getLine >>=
\last -> let full = first++" "++last
in putStrLn ("Pleased to meet you, "++full++"!")
둘 다 읽을 수 있는 낮은 편이다. 그러나 이 지향하는 '표기법 훨씬 더 삽입하십시오.
스케쳐내 못하며창조된 ',' 를 사용하지 않는 것이 구조화에 시도하시겠습니까 코드에서 많은 작은 총괄하였습니다. 이것은 좋은 습관 어쨌든 진실이며당신이 줄일 수 있는 '만 사용할 수 있는 아주 잘 할 수 있는' 블록 '>; = > 어졌다면 재장착하여 흐름선 2-3 에서 $ >', ',', '< < *> 상술합니다.;; 예를 들어, 위의 다시 쓰일 수 있다
name = getName >>= welcome
where
ask :: String -> IO String
ask s = putStr s >> getLine
join :: [String] -> String
join = concat . intersperse " "
getName :: IO String
getName = join <$> traverse ask ["What is your first name? ",
"And your last name? "]
welcome :: String -> IO ()
welcome full = putStrLn ("Pleased to meet you, "++full++"!")
D # 39 라고 i& 상황은 매우 유사한 사용할지 여부를 [포인트 무료 표기법] (http://www.haskell.org/haskellwiki/Pointfree), 방관하겠나 많은 경우가 많이 있다. (주로 최상위 예 ' [(+1), (7)] < >; [1.5] ') 이 표기법은 잘하는 것은 아니지만 포인트 무료 변환할지 할 경우 복잡한 표현식에서는 같은 결과를 얻을 수 있습니다
f = ((ite . (<= 1)) `flip` 1) <*>
(((+) . (f . (subtract 1))) <*> (f . (subtract 2)))
where
ite e x y = if e then x else y
D # 39 를 이해해야 상당히 오랜 시간이 날 데려가겠어요 it& 실행하지 않고 코드입니다. [스포일러 (아래 참조).]
! 'f (x = f (x < = 1) 다른 경우 다음 1 (x-1) + f (x-2)'
>. 또한, 왜 대부분의 자습서는 함께 가르치는 입출력 (i / o 책임질래?
'I / o' 는 등의 부작용이 있기 때문에 정확히 계산을 할 수 있도록 설계된 명령형 함께 한다 '는' 시퀀싱 사용하여 patran 매우 든다.
실용적 스타일입니까 제공하십시오 권장됨 구성되어있으며, 그 때문에 (그리고 그것은 이쁘게). 모나드 스타일입니까 필요한 경우도 있다. 참조 (https://stackoverflow.com/a/7042674/1019205) 에 대한 상세 설명.
'통사' 그냥 못하며창조된 표기법이 사용된다. 모든 경우에 이를 피할 수 있습니다. 하지만 경우에 따라서는 교체하십니까 지향하는 '을 (를)', '와' 코드 '는 > > = 복귀하십시오 덜 판독값.
따라서 단축시킵니다 질문을합니다.
>. 어떤 경우든 피하고, 잠시 실례해도 " 못하며창조된 기술서임을 "?;).
코드 선택해제합니다 향상시키는 데 초점을 맞추고, 보다 높은 판독값. 피해야 할 때 사용할 수 있도록 ',' 그렇지 않은 경우에는.
>. 또 다른 질문을 하고 있는 것으로, 입출력 (i / o 와 나에게 왜 대부분의 자습서는 책임질래?
할 수 있기 때문에 '보다' IO 코드를 읽을 수 있는 경우가 많습니다.
또한, 대부분의 사람들은 하스켈 com/go/learn_fl_cs4_learningas2_kr 명령형 프로그래밍 환경을 가지고 시작합니다. 자습서는 초보자도 있다. 이해하기 쉬운 스타일을 통해 시장을 놓고 사용해야 합니다.
이 표기법은 확장됨 충족되었으며 표현식에서는 지향하는 '기능을 사용하여' (> >. =) '와' (> >;) '및' let '표현식입니다. 그래서 속하지 않는 핵심은 욕금지
' (> >. =)' 와 ' (> >;)' 이 때, 이들이 결합하는 데 사용되는 순차적으로 작업 결과 에센셀 액션 구조가 변경되는 경우 다음과 같은 작업을.
질문 하나만 있는 주어진 예에서 볼 수 있기 때문에 i / o '없음' 이 없는 행동, 따라서 순서 필요하다.
예를 들어 표현식에서는 고려해보십시오
do x <- getLine
print (length x)
y <- getLine
return (x ++ y)
공감대를 형성하고 있는
getLine >>= \x ->
print (length x) >>
getLine >>= \y ->
return (x ++ y)
이 예에서는 지향하는 '표기법 (또는' (>; = >) '와' (> >;) '기능을) 는 입출력 (i / o' 작업 '이 필요한 순서.
그래서 이 프로그래머용 조만간 필요할 것입니다.