当我在Haskell中撰写"show"和"read"时会发生什么?

Cal*_*vin 4 generics haskell type-inference typeclass ghci

这是GHCi的简短成绩单:

Prelude> :t read
read :: Read a => String -> a
Prelude> :t show
show :: Show a => a -> String
Prelude> :t show.read
show.read :: String -> String
Prelude> (show.read) "whales"
"*** Exception: Prelude.read: no parse
Run Code Online (Sandbox Code Playgroud)

当我撰写时show,read我只能假设GHC选择了一些既Read能够又Show能够成为"中间"类型的任意类型.

它是如何选择这种类型的,有什么方法让我找出它是什么?

dfl*_*str 13

GHCi默认规则表明所选择的类型是().这是在Show需要实例时选择的默认类型.GHCi将选择()一般约束,Integer数值或积分约束,以及Double分数/其他实际约束.这不是由于一些Haskell内在的; 它就是如何实现GHCi,以便它可以作为计算器轻松使用.

如果您实际上已经在文件中输入了代码并对其进行了编译,则会应用更严格的GHC规则,并且您会收到一条错误消息,指出无法解析中间类型.

您当然可以通过给出一个类型的函数来指示GHC使用不同的类型,例如:

show . (read :: String -> Int)
Run Code Online (Sandbox Code Playgroud)

  • 您可以自己验证它也很容易选择`()`:`ghci>(show.read)"()"` (5认同)