没有数据构造函数的现有量化

时间:2019-03-13 21:52:12

标签: haskell existential-type

通过将字典打包在数据构造函数中,很容易获得存在量化。

{-# LANGUAGE GADTs #-}

data S where
  MkS :: Show a => a -> S

f :: Int -> S
f x = case x of
  0 -> MkS 0
  _ -> MkS "non-zero"

GHC指南中的相关section明确讨论了“现有量化的数据构造函数”。是否可以编写相同的代码但不引入额外的数据类型和构造函数,即带有诸如

这样的签名的东西
f :: Int -> (exists a. Show a => a)
f x = case x of
  0 -> 0
  _ -> "non-zero"

如果没有,是否存在此限制存在的成文原因?避免添加新的量词?

1 个答案:

答案 0 :(得分:4)

借用Colin的评论并查看此answer,可以编写没有exists量词的相同代码的CPS版本。

f' :: Int -> ((forall a. Show a => a -> r) -> r)
f' x = case x of
  0 -> \k -> k 0
  _ -> \k -> k "non-zero"

虽然这不是理想的选择,但可以解决此问题而无需引入额外的数据类型。