通过将字典打包在数据构造函数中,很容易获得存在量化。
{-# 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"
如果没有,是否存在此限制存在的成文原因?避免添加新的量词?
答案 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"
虽然这不是理想的选择,但可以解决此问题而无需引入额外的数据类型。