【问题标题】:Expand type synonyms, type families with GHCi使用 GHCi 扩展类型同义词、类型族
【发布时间】:2012-11-28 00:32:19
【问题描述】:

我想知道 GHCi(或其他地方)中是否存在从任意类型表达式中扩展类型同义词和族的功能。

例如,如果我有这些类型,

data A = A
data B = B

data F a = F a
data G a = G a
data H a b = H a b

type S a b = H (F a) (G b)
type T a = S (a) (H B a)

type family R a :: *
type instance R (H a b) = H b a

那么我希望能够在 ghci 会话中获得这种输出。

> :t undefined :: T (S B A)
undefined :: T (S B A) :: T (S B A)

> :texpand undefined :: T (S B A)
undefined :: T (S B A) :: H (F ((H (F B) (G A)))) (G (H B (H (F B) (G A))))

> :texpand undefined :: R (T (S B A))
undefined :: R (T (S B A)) :: H (G (H B (H (F B) (G A)))) (F ((H (F B) (G A)))) 

据我所知,GHCi 实际上并没有提供类似:texpand 命令的任何东西,而且我不确定它是否是该信息的最佳接口。但是,似乎可以通过某种方式从 GHC 中提取扩展类型,我真的很希望能够以交互方式查看它们。

欢迎黑客攻击、文档链接、关于 GHCi 未来添加的推测性讨论。

【问题讨论】:

    标签: haskell ghci type-families


    【解决方案1】:

    :kind! 会这样做:

    λ> :kind! T (S B A)
    T (S B A) :: *
    = H (F (H (F B) (G A))) (G (H B (H (F B) (G A))))
    λ> :kind! R (T (S B A))
    R (T (S B A)) :: *
    = H (G (H B (H (F B) (G A)))) (F (H (F B) (G A)))
    

    (为方便起见,您可以在.ghci 中添加类似:def k! \x -> return (":kind! " ++ x) 的内容。)

    【讨论】:

    • 值得一提的是,这是从 GHC 7.something 开始的新功能。 (4或6,我忘了)
    • 这在 GHC 8.0.2 中对我不起作用。它只是按原样打印类型别名,没有任何扩展。
    • 我对 GHC 8.2.1 也有同样的问题
    • 它再次适用于 GHC 9.2.1。请参阅release notes
    猜你喜欢
    • 2022-01-10
    • 2022-09-24
    • 1970-01-01
    • 2015-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    相关资源
    最近更新 更多