gpt4 book ai didi

haskell - 如何用 View 模式语法编写这个 case 表达式?

转载 作者:行者123 更新时间:2023-12-04 06:36:20 25 4
gpt4 key购买 nike

在我阅读了 RPN calculator 的示例之后在“向您学习 Haskell for Great Good!”我想以更一般的方式自己重写它。

为了轻松扩展可用函数,我将它们放在单独的列表中,并且与 lookup 匹配的模式使用 ViewPatterns 的函数句法。使用 read 读取输入我写了这个:

parse xs x = case readMaybe x of
Just x -> Right (x : xs)
Nothing -> Left "Syntax error

但我宁愿避免使用 case 表达式并再次使用这样的 View 模式:
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’
我不明白为什么。他们不是等价的吗?

整个代码是 here .

最佳答案

它们不是等价的。 case版本有一个readMaybe , View 模式版本有两个。对于每个 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"

只是不知道您没有阅读什么内容,也没有理由相信它与上面一行中的内容相同。

通常,除非只有一个感兴趣的结果,否则使用 View 模式是不合适的。如果您想进行一次中间计算,但将结果分析为不止一种情况,则它们是错误的语法。我很高兴保持记录,因为这个原因我认为它们是错误的。

关于haskell - 如何用 View 模式语法编写这个 case 表达式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28753054/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com