Haskell 让函数返回类型为的任意实例

Haskell 让函数返回类型为的任意实例,haskell,Haskell,我希望函数能够返回类型的所有可能实例(不确定是否为正确的单词)。像这样(fun不工作): 我的最终目标是拥有一个别名类型SomeT,它代表任意T 我想用它来解析DSL的类型声明。我有int和string类型,希望有一个解析函数来解析它们 这是可能的吗?通常的解决方案很简单 但是,您的确切问题可以通过使用用于特殊多态行为的TypeClass来解决: class TT a where tt :: a -> T a instance TT Int where tt = TIn

我希望函数能够返回类型的所有可能实例(不确定是否为正确的单词)。像这样(
fun
不工作):

我的最终目标是拥有一个别名类型
SomeT
,它代表任意
T

我想用它来解析DSL的类型声明。我有int和string类型,希望有一个解析函数来解析它们


这是可能的吗?

通常的解决方案很简单


但是,您的确切问题可以通过使用用于特殊多态行为的TypeClass来解决:

class TT a where
    tt :: a -> T a

instance TT Int where
    tt = TInt

instance TT String where
    tt = TString

fun :: (TT a) => Int -> T a
fun a | a >= 5    = tt "a lot"
      | otherwise = tt a

您可以使用存在类型包装器

data T a where
    TInt :: Int -> T Int
    TStr :: String -> T String

data SomeT where
    S :: T a -> SomeT

fun :: Int -> SomeT
fun a | a >= 5    = S $ TStr "a lot"
      | otherwise = S $ TInt a

foo :: SomeT -> Maybe (T Int)
foo (S x@(TInt _)) = Just x
foo _              = Nothing

不过,我希望能够在其他数据类型中限制类型
T
。如果没有类型变量,我将无法要求所有
Integral
类型(例如)。@snøreven您不能在Haskell的具体类型下隐藏多态类型。要么到处都有类型变量,要么必须坚持使用具体类型。在您的示例中,
fun
根据参数返回不同的类型,这也是不可能的(如果没有一些新的依赖类型扩展)。
class TT a where
    tt :: a -> T a

instance TT Int where
    tt = TInt

instance TT String where
    tt = TString

fun :: (TT a) => Int -> T a
fun a | a >= 5    = tt "a lot"
      | otherwise = tt a
data T a where
    TInt :: Int -> T Int
    TStr :: String -> T String

data SomeT where
    S :: T a -> SomeT

fun :: Int -> SomeT
fun a | a >= 5    = S $ TStr "a lot"
      | otherwise = S $ TInt a

foo :: SomeT -> Maybe (T Int)
foo (S x@(TInt _)) = Just x
foo _              = Nothing