gpt4 book ai didi

haskell - 高阶函数,输入 `|' 时解析错误

转载 作者:行者123 更新时间:2023-12-02 16:13:40 25 4
gpt4 key购买 nike

这是我的代码:

select_where_true :: (Double -> Bool) -> [Double] -> [Double]
select_where_true is_neg [a] = case [a] of
[] -> []
x:xs -> is_neg x
|(is_neg x) == False = []
|(is_neg x) == True = x ++ (select_where_true is_neg xs)


is_neg :: Double -> Bool
is_neg x = x < 0

这是错误消息:

[1 of 1] Compiling Main             ( test.hs, interpreted )

test.hs:5:18: parse error on input `|'
Failed, modules loaded: none.

有人愿意告诉我我的代码有什么问题吗?

感谢任何能给我一些建议的人。

最佳答案

看起来您正在尝试重新实现 takeWhile(或者可能是有缺陷的过滤器),因此我们可以简单地设置

select_where_true :: (Double -> Bool) -> [Double] -> [Double]
select_where_true = takeWhile

但是无论如何,您的代码存在几个问题。

  • 您遇到的语法错误是因为您在 case 中使用了错误的防护语法。正确的语法是

    case ... of
    pattern | guard -> ...
    | ... -> ...
  • 修复了代码中显示的类型错误。您尝试使用 ++ 将一个元素添加到列表中,但 ++ 连接了两个列表 。要添加元素,请改用 :。请参阅:What is the difference between ++ and : in Haskell?

  • 修复此问题后,代码可以编译,但有一个错误:它在空列表或包含以下内容的列表上失败:多个元素:

    > select_where_true is_neg []
    *** Exception: S.hs:(2,1)-(5,66): Non-exhaustive patterns in function select_where_true

    > select_where_true is_neg [1,2]
    *** Exception: S.hs:(2,1)-(5,66): Non-exhaustive patterns in function select_where_true

    这是因为您无意中进行了模式匹配:

    select_where_true is_neg [a] = ...
    ^^^

    这是一种仅匹配仅具有一个元素的列表的模式。要匹配任何列表,只需去掉括号。您还必须去掉 case [a] of ... 中的括号。

解决所有这些问题,我们最终得到

select_where_true :: (Double -> Bool) -> [Double] -> [Double]
select_where_true is_neg a = case a of
[] -> []
x:xs | (is_neg x) == False -> []
| (is_neg x) == True -> x : (select_where_true is_neg xs)

最后,一些风格建议:

  • 大多数括号都是不必要的。函数应用程序的优先级高于任何运算符。
  • 切勿编写 expr == Trueexpr == False。请使用expr非expr
  • 如果防护罩覆盖了所有情况,您可以用否则替换最后一个。
  • 像这样的带有守卫的 case 表达式有点尴尬。写多个通常更容易改为方程:

    select_where_true :: (Double -> Bool) -> [Double] -> [Double]
    select_where_true is_neg [] = []
    select_where_true is_neg (x:xs)
    | is_neg x = x : select_where_true is_neg xs
    | otherwise = []

关于haskell - 高阶函数,输入 `|' 时解析错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16525767/

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