let
은 임의의 값에 이름을 지정하거나 일치 패턴을 매기 만합니다.
<-
를 들어, 우리가 먼저 떨어져 (정말) 신비 IO
모나드에서 단계하지만, 목록 또는 Maybe
같은 "컨테이너"의 개념이 모나드를 생각해 보자. 그런 다음 <-
은 해당 컨테이너 요소를 "압축 해제"하지 않습니다. "되돌리기"의 반대 작업은 return
입니다.
add m1 m2 = do
v1 <- m1
v2 <- m2
return (v1 + v2)
두 컨테이너의 요소를 "압축 해제"하고 값을 함께 추가 한 다음 동일한 모나드에서 다시 래핑합니다.그것은 요소의 모든 가능한 조합을 복용, 목록에서 작동합니다
이
main = print $ add [1, 2, 3] [40, 50]
--[41,51,42,52,43,53]
사실 목록의 경우 당신은뿐만 아니라 add m1 m2 = [v1 + v2 | v1 <- m1, v2 <- m2]
작성할 수 있습니다. 그러나 우리의 버전도 Maybe
의 작동 :
main = print $ add (Just 3) (Just 12)
--Just 15
main = print $ add (Just 3) Nothing
--Nothing
지금 IO
전혀 다르지하지 않습니다. 단일 값을위한 컨테이너이지만 바이러스와 같이 "위험한"불필요한 값입니다. 직접적으로 만져서는 안됩니다. do
-Block은 여기 유리 용기이며, <-
은 내부의 물건을 조작하는 내장 "장갑"입니다. return
을 사용하면 준비가되었을 때 전체 그대로의 컨테이너 (위험한 콘텐츠가 아닌)를 제공합니다. 그런데 add
함수는 IO
값 (파일이나 명령 행 또는 임의 생성기에서 가져온 값)과 함께 작동합니다.