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