문제

다음 기능이 있다고 가정 해 봅시다.

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 (+)
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top