6
使用了一些扩展变量数,我可以做这样的事情:的构造方法的参数
{-# LANGUAGE GADTs #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
type family TF (a :: Bool) where
TF 'True = Int
TF 'False = Double
data D a where
D :: TF a -> D a
通知构造D
可以以两种方式工作。或者:
D :: Int -> D 'True
或
D :: Double -> D 'False
地使用这种模式,我可以彻底改变的参数取决于它的类型构造函数,而重新使用它的名字。
但是,我也想要参数的数量取决于它的名称。
我知道我可以用()
或Void
替换一些参数,但我宁愿将它们全部删除。
有没有办法做到这一点?
我不认为你可以用* constructor *来做这个,因为最终的codomain必须在语法上是你定义的数据类型。但是,如果你创建一个构造'D'的函数,我认为你可以通过使共域为一个类型的家族 – luqui
这看起来好像会使得类型推断更加困难,而且收益甚微。您可以使用'D :: F a - > D a',其中'F'根据'a'返回不同长度的元组类型。它需要更多的拳击,但没有那么多。 – chi
你为什么想这样做? –