
【해답 예】Haskell 리스트 모나드 초입문
2022-10-04 last update
7 minutes reading 하스켈Haskell 리스트 모나드 초입문 의 해답 예입니다.
목록 만들기
목록 만들기
【문1】 return
를 사용하여 [1, 2, 3]
를 만들어 주십시오.
main = do
print $ 1 : 2 : return 3
실행 결과[1,2,3]
타입 클래스 제약
【문 2】다음에 나타내는 함수 join
의 형태로부터 사양을 추정해, 코드로 검증해 주세요.
이중으로 중첩된 모나드를 단일로 합니다.
import Control.Monad
main = print $ join [[1, 2], [3]]
실행 결과[1,2,3]
루프
【질문 3】다음의 코드를 join
와 forM
로 써 써 주세요.
import Control.Monad
main = do
print $ join $ join $
forM [1..3] $ \x ->
forM "abc" $ \y ->
return (x, y)
실행 결과[(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c'),(3,'a'),(3,'b'),(3,'c')]
재구성
【질문 4】리스트 모나드를 다루는 bind
와 return'
를 구현해 주세요. bind
에는 foldr
를 사용하십시오.
bind xs f = foldr ((++) . f) [] xs
return' x = [x]
main = do
print $ [1..3] `bind` \x -> "abc" `bind` \y -> return' (x, y)
실행 결과[(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c'),(3,'a'),(3,'b'),(3,'c')]
목록 내포 표기
다시 쓰기
【질문 5】다음 리스트 내포 표기를 do
로 써 써 주세요.
main = do
print $ do
x <- [1..5]
y <- [1..5]
if x + y == 6
then return (x, y)
else []
실행 결과[(1,5),(2,4),(3,3),(4,2),(5,1)]
테스트
【문 6】문 5의 코드를 질문 4로 구현한 bind
와 return'
에 대응시켜 테스트해 주세요.
bind xs f = foldr ((++) . f) [] xs
return' x = [x]
main = do
print $ do
[1..5] `bind` \x -> [1..5] `bind` \y ->
if x + y == 6 then return' (x, y) else []
실행 결과[(1,5),(2,4),(3,3),(4,2),(5,1)]
main = do
print $ 1 : 2 : return 3
[1,2,3]
【문 2】다음에 나타내는 함수
join
의 형태로부터 사양을 추정해, 코드로 검증해 주세요.이중으로 중첩된 모나드를 단일로 합니다.
import Control.Monad
main = print $ join [[1, 2], [3]]
실행 결과
[1,2,3]
루프
【질문 3】다음의 코드를 join
와 forM
로 써 써 주세요.
import Control.Monad
main = do
print $ join $ join $
forM [1..3] $ \x ->
forM "abc" $ \y ->
return (x, y)
실행 결과[(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c'),(3,'a'),(3,'b'),(3,'c')]
재구성
【질문 4】리스트 모나드를 다루는 bind
와 return'
를 구현해 주세요. bind
에는 foldr
를 사용하십시오.
bind xs f = foldr ((++) . f) [] xs
return' x = [x]
main = do
print $ [1..3] `bind` \x -> "abc" `bind` \y -> return' (x, y)
실행 결과[(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c'),(3,'a'),(3,'b'),(3,'c')]
목록 내포 표기
다시 쓰기
【질문 5】다음 리스트 내포 표기를 do
로 써 써 주세요.
main = do
print $ do
x <- [1..5]
y <- [1..5]
if x + y == 6
then return (x, y)
else []
실행 결과[(1,5),(2,4),(3,3),(4,2),(5,1)]
테스트
【문 6】문 5의 코드를 질문 4로 구현한 bind
와 return'
에 대응시켜 테스트해 주세요.
bind xs f = foldr ((++) . f) [] xs
return' x = [x]
main = do
print $ do
[1..5] `bind` \x -> [1..5] `bind` \y ->
if x + y == 6 then return' (x, y) else []
실행 결과[(1,5),(2,4),(3,3),(4,2),(5,1)]
import Control.Monad
main = do
print $ join $ join $
forM [1..3] $ \x ->
forM "abc" $ \y ->
return (x, y)
[(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c'),(3,'a'),(3,'b'),(3,'c')]
【질문 4】리스트 모나드를 다루는
bind
와 return'
를 구현해 주세요. bind
에는 foldr
를 사용하십시오.bind xs f = foldr ((++) . f) [] xs
return' x = [x]
main = do
print $ [1..3] `bind` \x -> "abc" `bind` \y -> return' (x, y)
실행 결과
[(1,'a'),(1,'b'),(1,'c'),(2,'a'),(2,'b'),(2,'c'),(3,'a'),(3,'b'),(3,'c')]
목록 내포 표기
다시 쓰기
【질문 5】다음 리스트 내포 표기를 do
로 써 써 주세요.
main = do
print $ do
x <- [1..5]
y <- [1..5]
if x + y == 6
then return (x, y)
else []
실행 결과[(1,5),(2,4),(3,3),(4,2),(5,1)]
테스트
【문 6】문 5의 코드를 질문 4로 구현한 bind
와 return'
에 대응시켜 테스트해 주세요.
bind xs f = foldr ((++) . f) [] xs
return' x = [x]
main = do
print $ do
[1..5] `bind` \x -> [1..5] `bind` \y ->
if x + y == 6 then return' (x, y) else []
실행 결과[(1,5),(2,4),(3,3),(4,2),(5,1)]
main = do
print $ do
x <- [1..5]
y <- [1..5]
if x + y == 6
then return (x, y)
else []
[(1,5),(2,4),(3,3),(4,2),(5,1)]
bind xs f = foldr ((++) . f) [] xs
return' x = [x]
main = do
print $ do
[1..5] `bind` \x -> [1..5] `bind` \y ->
if x + y == 6 then return' (x, y) else []
[(1,5),(2,4),(3,3),(4,2),(5,1)]