我之前了解到:如何哈斯克尔“阅读”使用时,Haskell的<code>read</code>功能从<code>String</code>看一本数字时,你需要指定输出的类型,推断类型
read "2" :: Int
,除非你做这样的事情:
read "2" + 2
Haskell然后知道你正在尝试添加,因此它必须是一个数字。
但是,一个特定的函数引起了我的注意,因为通过查看函数我认为它不会编译,但它确实,我不知道为什么。
实现加法,减法和乘法这逆波兰式计算器:
solveRPN :: (Num a, Read a) => String -> a
solveRPN xs = head . foldl foldingFunction [] . words $ xs
where foldingFunction (x:y:ys) "*" = (x * y):ys
foldingFunction (x:y:ys) "+" = (x + y):ys
foldingFunction (x:y:ys) "-" = (y - x):ys
foldingFunction xs numberString = read numberString:xs
如果你给它像一个字符串“2 + 5”将返回此代码的7
最后一行是我无法理解的。当你把这个函数“2 +”在xs
列表中的第一个元素将是“2”和累加器在时间[]
,因此它会漏网之鱼第3种模式和最后一个会做自己的工作,因此:
foldingFunction [] "2" = read "2":[]
所以,我的问题是:read "2":[]
怎么没有崩溃?如果我试图在控制台执行这个位它会给解析错误,因为read
不知道该字符串应该是什么,对吧?怎么不是(read "2" :: Int):[]
什么的?
查看我的答案,为什么'read 2'在ghci中给出了'Parse error'。 – ErikR