GHC 能否解决这个额外的类型注释或者它是否带来了一些真实的东西?
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications #-}
module SOQuestionInstanceQuantification2 where
class IsomorphismFromTo a b where -- :~:
isofromto :: forall p. p a -> p b
to :: a -> b
--to = (isofromto) @((->) a) id -- Bad without (redundant ?) annotation
to = (isofromto :: (forall p. p a -> p b)) @((->) a) id -- Good with (redundant ?) annotation
编辑:删除多余的 DefaultSignatures
最佳答案
isofromto
的真实 签名包括类中的类型变量:
isofromto :: forall a b. IsomorphismFromTo a b => forall p. p a -> p b
因此,如果我们想在p
上显式,我们需要这样写
to = isofromto @a @b @((->) a) id
也传递这些参数。或者,
to = isofromto @_ @_ @((->) a) id
使这些论点得以推断。
在更长的选择中
to = (isofromto :: (forall p. p a -> p b)) @((->) a) id
签名不是多余的,因为它修复了 a
和 b
类型参数。
请注意,在一般情况下,必须传递这些额外的参数,因为我们可能想在 to @a @b
中调用 isofromto
来自另一个实例,例如isofromto @(a,b) @(b,a)
.
当然,Haskell 可以有一个符号来指示“从当前实例调用 isofromto
”,而无需额外的类型参数,但没有。我想在常规编程中类型推断已经涵盖了大多数情况,当它还不够时,类型应用程序已经提供了一种选择我们需要的实例(包括当前实例)的方法,所以我想没有强烈需要这样一个特殊的符号.
关于haskell - 在 Haskell 中输入签名打高尔夫球(或不打高尔夫球),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67431577/