2014-04-22 3 views
2

나는 다음과 같은 지능형리스트를 변환하는 시도했다 :하스켈 : 목록 함축과 고차 기능

f xs = [ x+8 | (x,_) <- xs ] 

는 고차 함수를 사용하여.

내 최초의 솔루션이었다 : f'

f' xs = map((+8).fst) xs 

두 버전 모두 같은 (정확한) 출력을 제공 :

f' xs = map (\(x,_) -> x+8) xs 

나는 여러 가지 다른 접근을 시도 후, 나는 다음도 작동 발견 ,하지만 튜플 목록에 map을 사용할 때 (+8).fst\(x,_) -> x+8 인 이유를 이해할 수 없습니다. F의

답변

7

fst의 정의

fst :: (a, b) -> a 
fst (a, _) = a 

상기 정의이다 : 현재, 패턴이 x 내지 제 인수 일치 8하여 증가하고 리턴 (람다로) 입력으로 쌍을 (.)의 우리는 당신의 기능을 확장하기 위해 이러한 정의를 사용하는 경우, 우리는

를 얻을

(.) :: (b -> c) -> (a -> b) -> a -> c 
(f . g) = \x -> f (g x) 

입니다

f' xs = map ((+8) . fst) xs 
f' xs = map (\x -> (+8) (fst x)) xs   -- definition of (.) 
f' xs = map (\x -> (+8) ((\(a, _) -> a) x)) -- definition of fst 
f' xs = map (\(a, _) -> (+8) a)    -- we can move the pattern matching 
f' xs = map (\(a, _) -> a + 8)    -- expand section 
+0

똑바로 대답, 방정식 추론 ftw 사랑 해요. +1 – luqui

4

두 버전 모두 '같은 (정확한) 출력을 제공하지만, 튜플의리스트에 맵을 사용하는 경우 (+8).fst(x,_) -> x+8와 동일한 이유를 이해하지 않습니다.

fst :: (a, b) -> a 

및 그것이 무엇 것은 한 쌍의 첫 번째 요소 (두 요소 튜플)를 얻어이다

fst의 유형이다.

(+8) :: Num a => a -> a 

그리고 그것이 무엇을하는 것은, 입력 할 Num을 취한다 그것에 + 8을 적용하고 결과를 반환입니다 :

(+8)의 유형입니다.

이제 (+8) . fst의 유형은 다음과 fst(+8)의 조성물

((+8).fst) :: Num c => (c, b) -> c 

. 특히 이것은 입력으로 쌍을 취하고 첫 번째 요소를 추출한 다음 8을 추가하는 함수입니다.

은 쉽게 볼 예를 들어 볼 수 있습니다 :

((+8).fst) (3, 'a') 
-- 11 

같은 일이 \ (x, _) -> x + 8으로 발생합니다.

(\ (x, _) -> x + 8) (3, 'a') 
-- 11 
+0

귀하의 설명에 따르면 매우 명확합니다. 불행히도 저는 두 가지 대답을 받아 들일 수 없습니다. – Josh