为什么在Haskell中需要这种类型的注释?

用户名

我正在研究GHC中函数重载的强大程度。我编写了以下代码:

class F_third_arg a where
  run_f :: (Integer, a) -> Integer

instance F_third_arg Integer where
  run_f (_, x) = x

instance F_third_arg String where
  run_f (x, _) = x

my_fun :: (F_third_arg a) => Integer -> (a -> Integer)
my_fun x = \a -> run_f(x, a)

main :: IO ()
main = putStrLn $ show( ((my_fun::Integer->(Integer->Integer)) 5) $ 6)

(是的,我需要-XTypeSynonymInstances -XFlexibleInstances),我很惊讶编译器在调用时需要类型注释my_fun它应用于两个数字-推断此注释有什么问题?开启这两个扩展的重载规则是什么?

约阿希姆·布雷特纳

您的代码的问题在于数字文字本身已经过载。所以文字6有类型Num a => a,而my_fun 5有类型F_third_arg b => b -> Integer因此,在类型推断期间,它将两个类型变量统一起来。但是由于没有其他要求,GHC在此处找不到要使用的具体类型,并给出了适当的错误消息:

test.hs:16:26:
    没有因使用“ my_fun”而引起的(F_third_arg a0)实例
    类型变量“ a0”含糊不清
    可能的解决方法:添加一个可修复这些类型变量的类型签名
    注意:几个可能的实例:
      instance F_third_arg字符串-在test.hs:9:10
      定义。instance F_third_arg整数-在test.hs:6:10定义。
    在表达式中:(my_fun 5)
    在“ show”的第一个参数中,即`(((my_fun 5)$ 6)'
    在第二个参数($)中,即show((my_fun 5)$ 6)

test.hs:16:38:
    (Num a0)没有实例字面量“ 6”的
    类型变量“ a0”不明确
    可能解决方法:添加类型签名以修复这些类型变量
    注意:有几种可能的实例:
      实例Num Double-在'GHC.Float'中定义
      实例Num Float-在'GHC.Float'实例中定义
      整数a => Num(GHC.Real.Ratio a)
        -定义在``GHC.Real'' 
      ...
    在``($)''的第二个参数中加上其他三个,即``6''
    在``show''的第一个参数中即``((my_fun 5)$ 6)''
    在第二个参数中($)的值,即`show((my_fun 5)$ 6)'

有人可能希望编译器会注意到这Integer是同时满足这两个要求的唯一类型,但是这种启发式方法会使您的代码相对脆弱,即,由于添加了新实例(例如F_third_arg Double,它会中断因此,编译器拒绝该代码,并要求您明确说明所涉及的类型。

您找到了一种解决它的方法,但是@leftroundabouts的使用建议6::Integer更好一些。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么Haskell无法推断这种类型?

来自分类Dev

为什么我的错误注释了这种类型签名却没有破坏事情?

来自分类Dev

我不明白为什么Haskell不能推论出这种类型

来自分类Dev

Haskell和Data.Array.//:为什么这种类型正确?

来自分类Dev

推导这种类型时,“学习Haskell”中的假设是什么?

来自分类Dev

打字稿:为什么PromiseLike可能是异步函数对象中的这种类型?

来自分类Dev

为什么要进行这种类型的铸造?

来自分类Dev

为什么这种类型的继承有效?

来自分类Dev

为什么是未定义这种类型我的方法?

来自分类Dev

为什么编译器无法推断这种类型?

来自分类Dev

为什么GHC无法推断出这种类型?

来自分类Dev

为什么 GetType() 无法识别这种类型?

来自分类Dev

Python 中这种类型的变量赋值是什么?

来自分类Dev

为什么Java中的Map <>设计为需要两种类型?Map <>和HashMap <>?

来自分类Dev

在没有 TypeScript 的情况下,这种类型注释如何在 React 代码中工作?

来自分类Dev

为什么这种类型的守护程序不能处理字符串?

来自分类Dev

为什么Symbol#to_proc具有这种类型的行为?

来自分类Dev

为什么隐式不触发这种类型相关的路径方案

来自分类Dev

这种类型的SwiftUI附加函数模式称为什么,如何制作自己的?

来自分类Dev

为什么这种类型的变量与字符串不兼容?

来自分类Dev

Haskell 中的“多种类型”

来自分类Dev

为什么注释lambda类型不需要-XScopedTypeVariables?

来自分类Dev

为什么这个多元函数需要类型注释?

来自分类Dev

为什么f =(+)不需要类型注释?

来自分类Dev

为什么在这里需要类型注释?

来自分类Dev

Haskell:模式匹配类型注释中需要ScopedTypeVariables

来自分类Dev

为什么需要这种模式?

来自分类Dev

这两种类型注释之间有何区别?为什么不同?

来自分类Dev

不确定我在Haskell中了解这种类型

Related 相关文章

  1. 1

    为什么Haskell无法推断这种类型?

  2. 2

    为什么我的错误注释了这种类型签名却没有破坏事情?

  3. 3

    我不明白为什么Haskell不能推论出这种类型

  4. 4

    Haskell和Data.Array.//:为什么这种类型正确?

  5. 5

    推导这种类型时,“学习Haskell”中的假设是什么?

  6. 6

    打字稿:为什么PromiseLike可能是异步函数对象中的这种类型?

  7. 7

    为什么要进行这种类型的铸造?

  8. 8

    为什么这种类型的继承有效?

  9. 9

    为什么是未定义这种类型我的方法?

  10. 10

    为什么编译器无法推断这种类型?

  11. 11

    为什么GHC无法推断出这种类型?

  12. 12

    为什么 GetType() 无法识别这种类型?

  13. 13

    Python 中这种类型的变量赋值是什么?

  14. 14

    为什么Java中的Map <>设计为需要两种类型?Map <>和HashMap <>?

  15. 15

    在没有 TypeScript 的情况下,这种类型注释如何在 React 代码中工作?

  16. 16

    为什么这种类型的守护程序不能处理字符串?

  17. 17

    为什么Symbol#to_proc具有这种类型的行为?

  18. 18

    为什么隐式不触发这种类型相关的路径方案

  19. 19

    这种类型的SwiftUI附加函数模式称为什么,如何制作自己的?

  20. 20

    为什么这种类型的变量与字符串不兼容?

  21. 21

    Haskell 中的“多种类型”

  22. 22

    为什么注释lambda类型不需要-XScopedTypeVariables?

  23. 23

    为什么这个多元函数需要类型注释?

  24. 24

    为什么f =(+)不需要类型注释?

  25. 25

    为什么在这里需要类型注释?

  26. 26

    Haskell:模式匹配类型注释中需要ScopedTypeVariables

  27. 27

    为什么需要这种模式?

  28. 28

    这两种类型注释之间有何区别?为什么不同?

  29. 29

    不确定我在Haskell中了解这种类型

热门标签

归档