【发布时间】:2017-01-22 09:36:19
【问题描述】:
在下面的代码中,我可以用什么替换x = ...。请注意,我不想对a 施加类限制(当然,a 已经是一种Bool,所以只能采用两种类型中的一种)。
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE KindSignatures #-}
data D (a :: Bool) where
D1 :: D True
D2 :: D False
x :: D a
x = ...
基本上,使用这样的 GADT,很容易对输入进行多态性(只需匹配适当的构造函数),但我想在输出中使用多态性。
【问题讨论】:
-
这是不可能的,没有办法返回
D a中的多态值,除非它在底部。如果/当我们得到pi类型(非擦除类型),那么就可以写x :: pi a. D a -
此外,尽管令人不快,
D Any是一个有效类型。DataKinds仍然允许类型级别未定义... -
我不介意未定义,只要定义了
x :: D True和x :: D False。 -
GHC 不知道
a :: Bool只能是True或False。在a :: Bool上调度是不可能的,因为它在运行时被删除。如果你想调度,你至少需要x :: SingI a => D a或x :: Sing a -> D a。 -
@Clinton 显式字典被传递,类型被删除。例如,对于
Show a => a -> IO ()之类的东西,它或多或少地实现为(a -> String) -> a -> IO ()。实际的类方法实现本身作为参数传入,因此类型不必如此。