ghci 函数在声明中提及多个变量不被接受

问题描述 投票:0回答:1

我正在尝试学习 Haskell,所以我尝试了这个:

$ ghci
GHCi, version 8.10.7: https://www.haskell.org/ghc/  :? for help
Prelude> :set +m
Prelude> let element :: (Eq a) => [a] -> a -> Bool   
Prelude|     element [] _ = False
Prelude|     element [x:_] x = True
Prelude|     element [_:xs] x = element xs x
Prelude| 

<interactive>:4:14: error:
    • Conflicting definitions for ‘x’
      Bound at: <interactive>:4:14
                <interactive>:4:19
    • In an equation for ‘element’
Prelude> 

那么在第 4 行,为什么它不只使用第一个绑定和强制等效呢?这显然是一个玩具问题;我知道我可以导入列表函数并使用

element = flip elem

我的下一次尝试将使用警卫......

Stackoverflow 不会发布此内容,除非我包含更多“详细信息” - 让我知道我缺少哪些详细信息,我将在评论中添加它们。

haskell ghci
1个回答
0
投票

x
不是变量;这是一个模式。模式在单个定义中必须是唯一的,这样分配给名称的值就不会含糊不清。您所询问的统一类型可能比避免明确的解决方法更复杂。

如果您想检查第一个参数的头部是否等于第二个参数,请使用单独的模式并在防护或定义本身中显式比较它们。

let element :: (Eq a) => [a] -> a -> Bool
    element [] _ = False
    element (x:xs) y | x == y = True
                     | otherwise = element xs x
© www.soinside.com 2019 - 2024. All rights reserved.