이 haskell 기능 에서이 값은 어디에서 나오나요?
문제
다음 기능이 있다고 가정 해 봅시다.
sumAll :: [(Int,Int)] -> Int
sumAll xs = foldr (+) 0 (map f xs)
where f (x,y) = x+y
결과 sumAll [(1,1),(2,2),(3,3)]
될거야 12
.
내가 이해하지 못하는 것은 어디에 있습니다 (x,y)
값이 나옵니다. 글쎄, 나는 그들이 나온 것을 안다 xs
가변적이지만 방법을 이해하지 못합니다. 내 말은, 키워드가있는 곳없이 위의 코드를 직접 수행하면 다음과 같은 것입니다.
sumAll xs = foldr (+) 0 (map (\(x,y) -> x+y) xs)
그리고 나는 최상위 코드에서 어떻게 f
변수 및 (x,y)
변수는 (\(x,y) -> x+y)
람다 표현.
해결책
Haskell에서는 기능이 일류 데이터 유형입니다.
즉, 정수 및 문자열과 같은 다른 유형의 데이터와 마찬가지로 기능을 전달할 수 있습니다.
위의 코드에서 당신은 'f'를 함수로 선언하는데, 이는 하나의 인수 (두 값 (x, y)의 튜플)을 취하고 (x + y)의 결과를 반환합니다.
Foldr는 3 인수, 이진 함수 (이 경우 +)를 시작하는 값 (0) 및 반복자에 대한 값 배열을 취하는 또 다른 함수입니다.
간단히 말해서 '여기서 f (x, y) = x + y'
sumAll :: [(Int,Int)] -> Int
sumAll xs = foldr (+) 0 (map myFunctionF xs)
myFunctionF :: (Int,Int) -> Int
myFunctionF (x,y) = x + y
편집하다: Foldr가 어떻게 작동하는지 잘 모르겠다면 확인하십시오. Haskell 참조 Zvon아래는 Foldl / Map의 구현 예입니다.
foldl :: (a -> b -> b) -> b -> [a] -> b
foldl _ x [] = x
foldl fx (y:ys) = foldl f (f y x) ys
map :: (a -> b) -> [a] -> [b]
map _ [] = []
map f (x:xs) = (f x) : (map f xs)
다른 팁
바라건대 이것은 도움이 될 것입니다. 핵심은 그 것입니다 f
쌍 인 목록의 요소에 적용됩니다.
sumAll [(1,1),(2,2),(3,3)]
-- definition of sumAll
= foldr (+) 0 (map f [(1,1),(2,2),(3,3)])
-- application of map
= foldr (+) 0 (f (1,1) : map f [(2,2),(3,3)])
-- application of foldr
= 0 + foldr (+) (f (1,1)) (map f [(2,2),(3,3)])
-- application of map
= 0 + foldr (+) (f (1,1)) (f (2,2) : map f [(3,3)])
-- application of foldr
= 0 + (f (1,1) + foldr (+) (f (2,2)) (map f [(3,3)]))
-- application of f
= 0 + (2 + foldr (+) (f (2,2)) (map f [(3,3)]))
-- application of map
= 0 + (2 + foldr (+) (f (2,2)) (f (3,3) : map f []))
-- application of foldr
= 0 + (2 + (f (2,2) + foldr (+) (f (3,3)) (map f [])))
-- application of f
= 0 + (2 + (4 + foldr (+) (f (3,3)) (map f [])))
-- application of map
= 0 + (2 + (4 + foldr (+) (f (3,3)) []))
-- application of foldr
= 0 + (2 + (4 + f (3,3)))
-- application of f
= 0 + (2 + (4 + 6))
= 0 + (2 + 10)
= 0 + 12
= 12
답이 아니지만 귀하의 기능이 F를 지적해야한다고 생각했습니다.
f (x, y) = x + y
로 표현할 수 있습니다
f = uncurry (+)
제휴하지 않습니다 StackOverflow