I recursion-schemes
라이브러리를 사용하여 다음과 같은 코드가 있습니다 let countBy = reduceBy (\case Nil -> 0 ; Cons a b -> succ b) id in countBy [42,5,5,8,8,8]
로RamdaJS reduceBy()
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE TypeFamilies #-}
import Data.Functor.Foldable
import Data.Maybe
import qualified Data.Map as M
reduceBy valueAlgebra keyFn = cata $ fooAlgebra valueAlgebra keyFn
fooAlgebra
:: Ord k =>
(ListF t a -> a) -> (t -> k) -> ListF t (M.Map k a) -> M.Map k a
fooAlgebra valueAlgebra keyFn = \case
Nil -> M.empty
Cons elt acc -> M.alter
(Just . (valueAlgebra . Cons elt) . fromMaybe (valueAlgebra Nil))
(keyFn elt)
acc
사용. 코드 흉내가 http://ramdajs.com/docs/#reduceBy
더 좋은 방법은 reduceBy
을 사용하여 recursion-schemes
을 사용하고 있습니까? alter
인수가 약해 보입니다. cata
정말 거기에 있습니까? 어떤 것들은 ana
과 cata
으로 구현 가능하다고 들었습니다.
당신은 목록의지도를 얻기 위해 catamorphism을 사용할 수있는 것처럼 보입니다. 그런 다음 각 그룹에 대해 catamorphism (실제로는 fold)을'fmap'합니다. – danidiaz
'valueAlgebra'를 적용하는 좀 더 모듈화 된 방법? 좋은 생각 같아. 이제 대수학을 교회에 부호화 된 버전을 받아들이는'alter'에 전달합니다. 그리고 디코딩은 고통 스럽습니다. – nponeccop