【问题标题】:Can GHCi perform substitutions in `:type <expr>` commands?GHCi 可以在 `:type <expr>` 命令中执行替换吗?
【发布时间】:2018-12-20 15:47:04
【问题描述】:

GHCi 有:type &lt;expr&gt; 来显示表达式的类型:

Prelude> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b

GHCi 可以显示替换任何类型变量后的结果吗?比如让f = ((-&gt;) c),然后

:t (<*>) ::  ((->) c) (a->b) -> ((->) c) a -> ((->) c) b
(<*>) ::  ((->) c) (a->b) -> ((->) c) a -> ((->) c) b
  :: (c -> a -> b) -> (c -> a) -> c -> b

有没有办法让 GHCi 解决这些替换问题?

【问题讨论】:

  • 您是否尝试过使用TypeApplications
  • @AJFarmar 如果有的话,类型构造函数的部分应用的语法是什么? :t (&lt;*&gt;) @Maybe 有效,但 Either a((-&gt;) r 之类的内容包含未定义的类型变量。
  • @chepner 您可以为此使用孔。 (&lt;*&gt;) @(Either _)(&lt;*&gt;) @((-&gt;) _)。如果你想要两个相同类型的孔怎么办?对于那个我不确定...
  • 是否有支持命名类型孔的 Haskell 版本,或者我在考虑 Idris(或者可能是 Agda)?
  • 我有一个巧妙的计划来模拟 GHC 中的命名类型孔。想象一下我想问:t id @(a -&gt; a)。我创建了一个新的类型别名type Tmp a = a -&gt; a。然后我问:t id @(Tmp _)。这可行(并且可以推广到其他命名类型孔的情况),但结果是 Tmp 应用程序未扩展,这有点不幸......

标签: haskell ghci


【解决方案1】:

是的,有几种方法。许多操作将其类型变量作为其 API 的一部分,您可以通过打开正确的选项并以正确的方式询问来观察这一点。

> :set -fprint-explicit-foralls 
> :t +v (<*>)
(<*>)
  :: forall (f :: * -> *).
     Applicative f =>
     forall a b. f (a -> b) -> f a -> f b

这实际上看起来并没有那么特别,但说明了一些重要的事情:因为foralld 类型变量没有用大括号括起来,它们可以成为类型应用程序的主题。 (但是您应该相信:t +v 查询中的“大括号”/“非大括号”区别!正常的:t 以脆弱的方式处理类型应用程序可用性,可能会从 GHC 版本更改为GHC 版本。)

> :set -XTypeApplications
> :t (<*>) @((->) _)
(<*>) @((->) _)
  :: forall {w} {a} {b}. (w -> a -> b) -> (w -> a) -> w -> b

有时您会发现不能以这种方式使用类型应用程序的术语。例如:

> :t +v \f x -> f <*> x
\f x -> f <*> x
  :: forall {f :: * -> *} {a} {b}.
     Applicative f =>
     f (a -> b) -> f a -> f b

这里的大括号表示没有可用于类型应用的类型。我们运气不好?不,我们仍然可以使用类型孔来仅填充我们关心的部分,并询问 GHC 其余部分。

> :set -XPartialTypeSignatures
> :set -Wno-partial-type-signatures
> :t (\f x -> f <*> x) :: ((_ -> _) -> _)
(\f x -> f <*> x) :: ((_ -> _) -> _)
  :: forall {w} {a} {b}. (w -> a -> b) -> (w -> a) -> w -> b

【讨论】:

    猜你喜欢
    • 2015-01-11
    • 1970-01-01
    • 1970-01-01
    • 2013-08-16
    • 1970-01-01
    • 2017-03-22
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多