Generics 当我写作时发生了什么;“显示”;及;改为;在哈斯克尔?

Generics 当我写作时发生了什么;“显示”;及;改为;在哈斯克尔?,generics,haskell,type-inference,typeclass,ghci,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

以下是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
当我撰写
show
read
时,我只能假设GHC选择了某种任意类型,即
read
能够和
show
能够作为“中间”类型


它是如何选择这种类型的,我有没有办法找到它是什么?

GHCi默认规则说选择的类型是
()
。如果需要
Show
实例,则选择默认类型。GHCi将选择
()
作为一般约束,选择
整数
作为数值或整数约束,选择
双精度
作为分数/其他实约束。这并不是由于哈斯克尔的内在原因;这就是GHCi是如何实现的,这样它就可以轻松地用作计算器

如果您确实在文件中输入了代码并对其进行了编译,则会应用更严格的GHC规则,并且您会收到一个错误,说明无法解析中间类型

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

show . (read :: String -> Int)

您可以自己验证它是否也很容易地选择了
()
ghci>(show.read)“()”
那么
read::String->String
呢?您需要传递读取的字符串在:
show中引用。(读::String->String)$“\“你好”