【发布时间】:2016-05-27 13:27:14
【问题描述】:
我之前了解到,在使用 Haskell 的 read 函数从 Strings 读取数字时,需要指定输出类型,如:
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 5 +”时,xs 列表中的第一个元素将是“2”并且累加器在时间是 [],因此它会滑过前 3 个模式,最后一个将完成它的工作,因此:
foldingFunction [] "2" = read "2":[]
所以,我的问题是:read "2":[] 怎么没有崩溃?如果我试图在控制台中执行这个位,它会给出解析错误,因为read 不知道那个字符串应该是什么,对吧?怎么不是(read "2" :: Int):[]什么的?
【问题讨论】:
-
查看我的回答,了解为什么
read 2在 ghci 中给出Parse error。
标签: haskell types type-inference