누군가이 기능을 사용하는 이유를 말해 줄 수 있습니까? " ?하스켈 : 점이있는 점
longestProductLen :: [(Barcode, Item)] -> Int
longestProductLen = maximum . map (length . fst . snd)
누군가이 기능을 사용하는 이유를 말해 줄 수 있습니까? " ?하스켈 : 점이있는 점
longestProductLen :: [(Barcode, Item)] -> Int
longestProductLen = maximum . map (length . fst . snd)
.
은 기능 구성입니다. 예 f
가 (+5)
경우 그래서 그것은
(.) :: (b->c) -> (a->b) -> a -> c
f . g = \x -> f (g x)
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 것을 발견했습니다 수 있습니다.
다른 대답은 좋은,하지만 쉽게 읽을, 당신은 정신적으로 단지 방정식의 양쪽에 변수를 추가하고 교체 .
을 $
또는 괄호에 의해, 그래서 당신의 예를 읽을 것이라고 할 수 있습니다
longestProductLen xs = maximum $ map (\y -> length $ fst $ snd y) xs
참고 : 원래 버전은 "pointfree style"입니다 ("점"은 점이 아니라 변수 임).
"m"이 사용 된 것과 같은 이유 때문입니다. – Ingo