如何从Haskell中的(G)ADT参数获取构造函数作为函数?

Ale*_* K. 0 haskell gadt

如何从Haskell中的(G)ADT参数获取构造函数作为函数?可以这样做吗?

data  Ex1 =  C1 Int | C2 Int -- | ..... 
           | C3

fun :: Ex1 -> Ex1
fun C3    = C3
fun (c i) = c $ i^2
Run Code Online (Sandbox Code Playgroud)

这对我来说不合适.

fun (C1 i) = C1 $ i^2
fun (C2 i) = C2 $ i^2
Run Code Online (Sandbox Code Playgroud)

Sib*_*ibi 6

如果您可以更改当时的类型Ex1:

{-# LANGUAGE DeriveFunctor #-}

data  Ex1 a =  C1 a | C2 a
            | C3 deriving (Show, Functor)

fun :: Ex1 Int -> Ex1 Int
fun y = fmap (\x -> x^2) y
Run Code Online (Sandbox Code Playgroud)

演示ghci:

?> fun $ C1 3
C1 9
?> fun $ C2 3
C2 9
?> fun C3
C3
Run Code Online (Sandbox Code Playgroud)