2012-11-07 3 views
1

누군가이 기능을 사용하는 이유를 말해 줄 수 있습니까? " ?하스켈 : 점이있는 점

 longestProductLen :: [(Barcode, Item)] -> Int 
    longestProductLen = maximum . map (length . fst . snd) 
+2

"m"이 사용 된 것과 같은 이유 때문입니다. – Ingo

답변

4

.은 기능 구성입니다. 예 f(+5) 경우 그래서 그것은

(.) :: (b->c) -> (a->b) -> a -> c 
f . g = \x -> f (g x) 
6
longestProductLen :: [(Barcode, Item)] -> Int 
longestProductLen = maximum . map (length . fst . snd) 

.으로 정의 할 수는 우리

(maximum .map (+5)) [1,2,3,4] 
= maximum (map (+5) [1,2,3,4]) 
= maximum [6,7,8,9] 
= 9 

하여 얻을 수 있으므로 maximum. map f지도 f는 다음 최대을 의미 기능 조성물 당신이 준 코드 .(length . fst . snd)에도 사용됩니다. 우리는이 목록을 통해 f를 매핑하는 경우 longestProductLen :: [(Barcode, Item)] -> Int 때문에, f 유형 (Barcode, Item)의 데이터를 수용해야한다는

알 수 있습니다.

이것은 snd이며, 다음 항목이 주어집니다. fst이므로 type Item = (Product,???)이어야합니다. 나는 무엇을 모르는가 ?? 당신의 기능에 대해서는 중요하지 않습니다. 나는 Double을 추측 할 것이다.

다음은 length이므로 type Product = [????]입니다. 나는 그것이 [Char], 즉 String 인 것으로 의심하지만, 길이면 충분합니다.

는 그럼 몇 가지 샘플 데이터에 그를 통해 작업 할 수 :

(length . fst . snd) ("|| ||| | ||| | || |||| | |", ("Gruyere",1.05)) 
= (length . fst) (snd ("|| ||| | ||| | || |||| | |", ("Gruyere",1.05))) 
= (length . fst) ("Gruyere",1.05) 
= length (fst ("Gruyere",1.05)) 
= length "Gruyere" 
= 7 

함께 퍼팅

longestProductLen [("|| ||| | ||| | || |||| | |", ("Gruyere",1.05)), 
        ("| ||| || ||| || |||| || |", ("Emmental",0,97)), 
        ("||||| ||| ||| || | || |||", ("Gouda",1,21))] 
= maximum . map (length . fst . snd) 
        [("|| ||| | ||| | || |||| | |", ("Gruyere",1.05)), 
        ("| ||| || ||| || |||| || |", ("Emmental",0,97)), 
        ("||||| ||| ||| || | || |||", ("Gouda",1,21))] 
= maximum [7,8,5] 
= 8 

그래서 우리가 (에멘탈에서) 가장 긴 제품의 길이가 8 것을 발견했습니다 수 있습니다.

1

다른 대답은 좋은,하지만 쉽게 읽을, 당신은 정신적으로 단지 방정식의 양쪽에 변수를 추가하고 교체 .$ 또는 괄호에 의해, 그래서 당신의 예를 읽을 것이라고 할 수 있습니다

longestProductLen xs = maximum $ map (\y -> length $ fst $ snd y) xs 

참고 : 원래 버전은 "pointfree style"입니다 ("점"은 점이 아니라 변수 임).