【发布时间】:2018-12-20 15:47:04
【问题描述】:
GHCi 有:type <expr> 来显示表达式的类型:
Prelude> :t (<*>)
(<*>) :: Applicative f => f (a -> b) -> f a -> f b
GHCi 可以显示替换任何类型变量后的结果吗?比如让f = ((->) 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 (<*>) @Maybe有效,但Either a或((->) r之类的内容包含未定义的类型变量。 -
@chepner 您可以为此使用孔。
(<*>) @(Either _),(<*>) @((->) _)。如果你想要两个相同类型的孔怎么办?对于那个我不确定... -
是否有支持命名类型孔的 Haskell 版本,或者我在考虑 Idris(或者可能是 Agda)?
-
我有一个巧妙的计划来模拟 GHC 中的命名类型孔。想象一下我想问
:t id @(a -> a)。我创建了一个新的类型别名type Tmp a = a -> a。然后我问:t id @(Tmp _)。这可行(并且可以推广到其他命名类型孔的情况),但结果是Tmp应用程序未扩展,这有点不幸......