"" .
, , ( Show). , , "" , , .
generics-sop . Generics GGC , , sequence ap, .
generics-sop, merge funtion. :
{-
{-
{-
{-
import Control.Applicative (liftA2)
import qualified GHC.Generics as GHC
import Generics.SOP
A , , generics-sop:
fn_2' :: (a -> a -> a) -> (I -.-> (I -.-> I)) a -- I is simply an Identity functor
fn_2' = fn_2 . liftA2
, , Generic:
merge :: (Generic a, Code a ~ '[ xs ]) => NP (I -.-> (I -.-> I)) xs -> a -> a -> a
merge funcs reg1 reg2 =
case (from reg1, from reg2) of
(SOP (Z np1), SOP (Z np2)) ->
let npResult = funcs `hap` np1 `hap` np2
in to (SOP (Z npResult))
Code - , , . , .
Code a ~ '[ xs ] , " ", , .
(SOP (Z _) () . SOP " ".
:
data Person = Person
{
name :: String
, age :: Int
} deriving (Show,GHC.Generic)
instance Generic Person -- this Generic is from generics-sop
mergePerson :: Person -> Person -> Person
mergePerson = merge (fn_2' (++) :* fn_2' (+) :* Nil)
Nil :* ( NP, n). , .
. , , , hcpure:
class Mergeable a where
mergeFunc :: a -> a -> a
instance Mergeable String where
mergeFunc = (++)
instance Mergeable Int where
mergeFunc = (+)
mergePerson :: Person -> Person -> Person
mergePerson = merge (hcpure (Proxy :: Proxy Mergeable) (fn_2' mergeFunc))
hcliftA2 ( hcpure, fn_2 hap) .