Generics 当我写作时发生了什么;“显示”;及;改为;在哈斯克尔?
以下是GHCi的简短记录: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
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)$“\“你好”