haskell - 在 Haskell 中输入签名打高尔夫球(或不打高尔夫球)

标签 haskell

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

签名不是多余的,因为它修复了 ab 类型参数。

请注意,在一般情况下,必须传递这些额外的参数,因为我们可能想在 to @a @b 中调用 isofromto 来自另一个实例,例如isofromto @(a,b) @(b,a).

当然,Haskell 可以有一个符号来指示“从当前实例调用 isofromto”,而无需额外的类型参数,但没有。我想在常规编程中类型推断已经涵盖了大多数情况,当它还不够时,类型应用程序已经提供了一种选择我们需要的实例(包括当前实例)的方法,所以我想没有强烈需要这样一个特殊的符号.

关于haskell - 在 Haskell 中输入签名打高尔夫球(或不打高尔夫球),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67431577/

相关文章:

Haskell 枚举从 1 开始

haskell - 递归方案的库实现

haskell - 将超过 1 个参数传递给 monad

haskell - C++ 和 Haskell 中的树遍历

parsing - Parsec 解析不同类型语句的列表

haskell - haskell 中的类型类依赖和 OOP 中的子类型有什么区别?

haskell - 反转效果顺序的应用仿函数

list - 避免不完整的模式匹配

haskell - Elm 的信号系统可以作为 Haskell 库使用吗?

list - Haskell 声明空列表,但实际上哪个不是空的?