2017-10-30 1 views

답변

3

당신이 취할 필요가있는 유일한 추가 단계가 concat이다 enate와 목록 :

concat (map (\(x,y) -> [x,y]) [(1,4),(2,5)]) 

여기 concat :: [[a]] -> [a]은 목록의 목록을 단일 목록으로 연결합니다. concatMap :: (a -> [b]) -> [a] -> [b] :

concatMap (\(x,y) -> [x,y]) [(1,4),(2,5)] 

또한 list comprehension를 사용하고 쓸 수가 좋아 : data

[z | (x,y) <- data, z <- [x,y]] 

입니다 같은 구조물 이후

은 더 편리하게 기능이 종종 발생 귀하의 초기 데이터 목록.

+0

나는 목록의 이해력이 더 좋기 때문에 이해하기가 더 쉽습니다.감사합니다 –

+0

@DavidAndvett : 프랑스는 이렇게 말합니다 : "* des goûts et des couleurs, ne discute pas *", 그래서 당연히 당신에게 달려 있습니다 :) –

5

당신이 설명하는 것은 일반적인 하스켈 패턴입니다!

  1. 은 하나의리스트로 참여 각 요소에 대해 목록을 생성하는 기능을 사용하여 목록
  2. 을 가져 가라.

그것은리스트가 될 필요가 없습니다,

  1. 가 컨테이너에 참여 각 요소에 대해 새 컨테이너를 생성하는 기능을 사용하여 컨테이너
  2. 을 가져 가라.
  3. 목록 케이스를 들어

,이 기능의 유형은

[a] -> (a -> [a]) -> [a] 

이의이 m 컨테이너 유형입니다 am a의 컨테이너를 부르 자 할 것이다. 이 경우, 우리는

m a -> (a -> m a) -> m a 

이 기능은 >>= 인 것이다! 중위 연산자로 사용합니다. 컨테이너가 하나 개의 층으로 2 층 "붕괴"를 지원하는

Prelude> [(1,4),(2,5)] >>= \(x,y) -> [x,y] 
[1,4,2,5] 

.... 이것은 모나드입니다.

a >>= f은 Willem Van Onsem에서 제안한대로 concatMap f a과 같습니다.

+0

호기심에서 벗어났습니다. 어떻게''='? –

+2

''= '은 보통 [배웁니다 하스켈] (http://www.learnyouahaskell.com/a-fistful-of-monads)에 따라 _bind_로 발음됩니다. 나는 이것을 _stuff into_-operator로 생각하는 경향이있다. – Teodor

관련 문제