2011-02-26 11 views
0

다음에 대한 몇 가지 매력적인 하스켈 구문을 찾고 있습니다.각 인수에 대한 목록을 함수로 매핑하십시오.

4 개의 인수를 취하는 함수가 있습니다. A B C 형 D F

= 뭔가

I는 각 인자에 대한 목록을 제공하고, 각 조합의 결과의리스트를 다시 얻고 자.

기본적으로 중첩 된지도 기능입니다.

나는 우아한 해결책이 있어야하는 것처럼 떨어졌다. 그러나 나는 컴파일 할만한 것을 찾지 못했습니다.

+2

나는 당신이 원하는 것을 잘 모릅니다. 입력과 출력 예제를 보여 주시겠습니까? –

+2

문구를 다시 사용할 수 있습니까? zip4를 찾으십니까? 아니면 zipWith4? 원하는 기능의 유형은 무엇입니까? – Xoltar

답변

6

귀하의 질문은 명확하지 않습니다 : 가능한 모든 조합을 원하십니까 (첫 번째 목록에서 a, 두 번째 등에서는 b) 또는 처리 목록을 일명 zip으로 처리하십시오 (각 목록의 첫 번째 요소 인 두 번째 요소 등).

모두 잘 실용적 펑터으로 해결할 수 있습니다

Prelude> let f a b c d = (a,b,c,d) 
Prelude Control.Applicative> :m +Control.Applicative 
Prelude Control.Applicative> f <$> [1,2] <*> [3,4] <*> [5,6] <*> [7,8] 
[(1,3,5,7),(1,3,5,8),(1,3,6,7),(1,3,6,8),(1,4,5,7),(1,4,5,8),(1,4,6,7),(1,4,6,8),(2,3,5,7),(2,3,5,8),(2,3,6,7),(2,3,6,8),(2,4,5,7),(2,4,5,8),(2,4,6,7),(2,4,6,8)] 
Prelude Control.Applicative> getZipList $ f <$> ZipList [1,2] <*> ZipList [3,4] <*> ZipList [5,6] <*> ZipList [7,8] 
[(1,3,5,7),(2,4,6,8)] 
+0

또한 일반 구문에 관해서는 http://personal.cis.strath.ac.uk/~conor/pub/she/idiom.html을 참조하십시오. – barsoap

+0

나는 OP가 List Applative 인스턴스의 가장 좋아하는 용도로 사용되는 첫 번째에 대해 묻고 있다고 생각합니다. –

+1

두 번째 옵션에는 일반 함수가 있습니다. zipWith4 f [1,2] [3,4] [5,6] [7,8] –

0

은 내가 당신이 찾고있는 것을 얻을 생각 :

fourway BS CS ds는 =지도 (curry4의 F)로 F [ (r, s, t, u) | R < - < 기지국, t - - < s 정도 CS를 U < - DS] curry4의 F (A, B, C는, d) =

을 fabcd
는 사용자가 할 수있는 시점 자유롭고 더 귀여워 라. 그러나 나는 이것이 당신이 원하는 것이고 읽기 쉽다고 생각한다.

관련 문제