如何描述函数必须接受某个构造函数并返回其实例



我有数据类型:

data MyData = D1 {several_records} | D2 {several_records} | D3 {several_records} | 

如何创建一个函数,使其接受MyData并返回MyData它接受的参数和返回类型必须属于MyData的同一构造函数?

myFunc :: MyData -> MyData -- not presicely what I want

请注意,在我的真实项目中,我有更多的MyData构造函数,因此,简单地为MyFunc逐一枚举它们并不是我想要的——我想一次将它们全部泛化

使用GADT,可能是:

{-# LANGUAGE DataKinds, GADTs, KindSignatures #-}
data MyDataTag = DT1 | DT2 | DT3
data MyData :: MyDataTag -> * where
D1 :: { foo_record :: Int, bar_record :: String } -> MyData 'DT1
D2 :: { baz_record :: Char } -> MyData 'DT2
D3 :: { qux_record :: Double } -> MyData 'DT3
myFunc :: MyData a -> MyData a
myFunc (D1 foo bar) = D1 (foo + 1) (bar ++ "hello")
myFunc (D2 _) = D2 'x'
myFunc (D3 qux) = D3 (-qux)

最新更新