我正在阅读以下小节现实世界 Haskell 第 6 章(类型类) http://book.realworldhaskell.org/read/using-typeclasses.html关于一个实例Read
for Color
,它实现了readsPrec
功能。我不知道当我打字时会发生什么(read "[Red]") :: [Color]
在 GHCi 中,得到[Red]
result.
为了简单起见,我稍微改变了这个函数的实现,如下所示:
instance Read Color where
readsPrec _ value = [(Red, drop (length "Red") value)]
现在,我的困惑是:在 GHCi 中,我们可以按如下方式使用上面的内容:
*Main> let readsPrec 2 "Red]" = [(Red, drop (length "Red") "Red]")]
*Main> readsPrec 2 "Red]"
[(Red,"]")]
Why readsPrec _ value = [(Red, drop (length "Red") value)]
return [Red]
执行时(read "[Red]") :: [Color]
?
两个实例之间正在发生交互readsPrec
:
- the
readsPrec
你定义为instance Read Color
- the
readsPrec
Prelude 定义为instance Read [a]
让我们调用readsPrec
in #2 readsPrecList
.
评价时
read "[Red]" :: [Color]
首先发生的是readsPrecList
叫做。该函数吞噬了前导方括号并调用您的readsPrec
输入字符串“Red]”。您的函数删除前三个字符并返回到readsPrecList
与价值Red
并将输入字符串设置为“]”。该函数检查下一个字符是否是右方括号,并返回列表中的值 - 即[Red]
.
为什么评估从调用开始readPrecList
?因为你在问read
创建某物的列表。
为什么readsPrecList
打电话给readsPrec
对于类型Color
?因为你问了read
创建一个列表Color
values.
这是类型定向调度的一个示例 - 的实例readsPrec
调用由所请求值的类型决定。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)