때때로 다른 접기 기능을 사용하여 튜플 목록을 하나의 튜플로 접기를 원할 때가 있습니다. 예를 들어, runState 결과 목록을 함께 묶어 어떤 의미에서 결합 된 상태와 결합 된 결과를 얻으려면 그것은 작동하지만 나는이 람다에 대한 불편,화살표를 사용하여 튜플 목록을 접을 때
wish :: (a -> a' -> a) -> (b -> b' -> b) -> (a,b) -> [(a', b')] -> (a,b)
wish lfn rfn x xs = foldl (\(a,b) -> (lfn a) *** (rfn b)) x xs
:
는 다음의 구현을 고려하십시오. lfn *** rfn
그 자체는 (a,b) -> (a -> a', b -> b')
유형을 가지고 있는데, 패턴 일치를 사용하지 않고도 튜플에 올바르게 적용 할 수있는 방법을 찾을 수 없습니다. 내가 누락 된 명확하고 우아한 방법이 있습니까? 그것은 (a,a') -> (a -> a, a' -> a') -> (a, a')
유형의 라이브러리 함수 일 수도 있고 전혀 다른 접근 방식 일 수도 있습니다.
BiApplicative 클래스의 일종입니다. 아마도 어딘가에 hackage가있을 것입니다. 그러나 나는 그것을 다른 사람들에게 남겨 두어 어떤 것이 좋고 더 이상 사용되지 않을지를 설명 할 것입니다. – Carl
http://squing.blogspot.com/2008/11/beautiful-folding.html 및 Hackage에 대한 인스턴스화, http://hackage.haskell.org/package/ZipFold –