阅读完“了解Haskell带来的好处!”中的RPN计算器示例之后,我想用更一般的方式自己重写它。
为了轻松扩展可用功能,我将这些功能放在单独的列表中,并lookup
使用ViewPatterns
语法将其与该功能匹配的模式。为了阅读输入,read
我这样写:
parse xs x = case readMaybe x of
Just x -> Right (x : xs)
Nothing -> Left "Syntax error
但我宁愿避免使用case表达式,而再次使用如下所示的视图模式:
parse xs (readMaybe -> Just x ) = Right (x : xs)
parse xs (readMaybe -> Nothing) = Left "Syntax error"
但是与后者我得到这个错误: No instance for (Read a0) arising from a use of ‘readMaybe’
我不明白为什么。他们不是等效的吗?
整个代码在这里。
它们不相等。该case
版本有一个readMaybe
,视图模式版本有两个。对于每个readMaybe
,编译器必须推断哪种类型是尝试读取的目标。当代码说
parse xs x = case readMaybe x of
Just x -> Right (x : xs)
Nothing -> Left "Syntax error
GHC侦探注意到,在您的Just x
情况下,x
最终被许可为xs
,因此必须采用所拥有元素的任何类型xs
。那是很好的工作。
但是当你写
parse xs (readMaybe -> Just x ) = Right (x : xs)
parse xs (readMaybe -> Nothing) = Left "Syntax error"
您将创建两个单独的find-the-target-type问题,每次使用都会产生一个问题readMaybe
。第一个问题的解决方法与第case
一种情况相同,但第二个问题的解决方法是单独阅读,
parse xs (readMaybe -> Nothing) = Left "Syntax error"
还有就是不知道是什么这是你无法阅读,没有理由相信这是同样的事情在上面的线。
通常,除非只有一个令人感兴趣的结果,否则使用视图模式是不合适的。如果您想一次进行中间计算,但它们的语法是错误的,但是将结果分析为多种情况。出于这个原因,我很高兴继续记录下来,认为我的功能不当。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句