I는 모두 맵핑 / 변환 할 수 스칼라 또는 하스켈 함수 찾지 못한 Either
의 Left
및 Right
유형, 즉 함수 동시에 두 변환 기능을 가지고 사건
(A => C, B => D) => Either[C, D]
대한 Either[A, B]
스칼라, 또는 유형
(a -> c, b -> d) -> Either a b -> Either c d
Haskell에서. Scala에서는 다음 fold
과 같이 호출하는 것과 같습니다.
def mapLeftOrRight[A, B, C, D](e: Either[A, B], fa: A => C, fb: B => D): Either[C, D] =
e.fold(a => Left(fa(a)), b => Right(fb(b)))
또는 Haskell에서는 다음 either
과 같이 호출하는 것과 같습니다.
mapLeftOrRight :: (a -> c) -> (b -> d) -> Either a b -> Either c d
mapLeftOrRight fa fb = either (Left . fa) (Right . fb)
이와 같은 기능이 라이브러리에 있습니까? 그렇지 않다면 이와 같은 것이 매우 실용적이라고 생각하는데, 언어 디자이너는 왜 그것을 거기에 넣지 않기로 선택합니까?
Scala에 대해 모르지만 Haskell에는 유형 서명에 대한 검색 엔진이 있습니다. 그것은 당신이 작성한 것에 대한 결과를 제공하지 않지만 Haskell 함수는 관례에 따라 curried † 동안 튜플 인수를 취하기 때문 입니다. https://hoogle.haskell.org/?hoogle=(a -> c) -> (b -> d) -> Either a b -> Either c d
가장 분명한 것은 다음과 같습니다.
mapBoth :: (a -> c) -> (b -> d) -> Either a b -> Either c d
... 실제로 Google조차도이를 발견합니다. 유형 변수가 생각한 것과 똑같기 때문입니다. (Hoogle은 당신(x -> y) -> (p -> q) -> Either x p -> Either y q
이 그것을 쓰면 그것을 또한 찾습니다 .)
그러나 실제로 Martijn이 말했듯이에 대한이 동작 Either
은 bifunctor 의 특수한 경우 일 뿐이며 실제로 Hoogle은 base
라이브러리에 정의 된보다 일반적인 형식도 제공합니다 .
bimap :: Bifunctor p => (a -> b) -> (c -> d) -> p a c -> p b d
† TBH Hoogle이 자체적으로 서명을 커리거나 논쟁을 바꾸지 못하는 것에 대해 약간 실망합니다. 실제로 자동으로 수행하는 데 사용되었지만 어느 시점에서 그들은 엄청난 수의 라이브러리로 인해 시간이 걸리고 결과 수가 손에 닿지 않았기 때문에 알고리즘을 단순화했습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다