[英]Member Function in Haskell
正在为班级做少量作业,但Haskell遇到了很多麻烦。 我正在尝试使用一种递归方法来查找整数是否为列表的一部分。 我知道要点,但是无法通过haskell语法使其正常工作。 检查当前列表是否为空,如果是,则为False,然后检查integer是否等于当前列表的头部,如果是,则为True,然后再以您要搜索的相同值再次调用成员,并以名单。 我该怎么做才能使此功能正常运行。
目前,这是我所拥有的:
member ::Int -> [Int] -> Bool
member x y
if y [] then False
else if x == head y then True
else member x tail y
我也尝试使用
member :: (Eq x) => x -> [x] -> Bool
作为起点,并且也更简单:
let member x y = if null y then False
else if x == head y then True
else member x tail y
任何帮助,将不胜感激。
与模式匹配,您可以更清晰地编写它
member :: (Eq a) => a -> [a] -> Bool
member x [] = False
member x (y:ys) | x==y = True
| otherwise = member x ys
element _ [] = False
element e (x:xs) = e == x || e `element` xs
-- OR
element e xs = if xs == [] then False
else if e == head xs then True
else e `element` tail xs
-- OR
element e xs = xs /= [] && (e == head xs || e `element` tail xs)
-- x `op` y = op x y
-- If you're feeling cheeky
element = elem
您的语法看起来很混乱,但是您的逻辑是有道理的,因此这里有很多要记住的事情:
函数可以由多个方程式定义。 从上到下检查方程式。 这意味着使用=
。
模式匹配不是相等性测试。 模式匹配如果匹配则将值分解为其组成部分,否则失败。 相等性测试x == y
返回有关x
和y
相等性的Bool
。
模式匹配用于通过...进行流量控制
case
陈述,例如
case xs of { [] -> ... x:xs' -> ... }
多个方程式,例如
element _ [] = ... element e (x:xs) = ...
请注意,您可以使用_
忽略模式中的值。 对于具有多个参数的函数的多个方程式,您实际上是一次对所有参数进行模式匹配。
Bool
通过if _ then _ else _
用于流量控制:
if xs == [] then False else True
这真的只是
case x == y of { True -> False False -> True }
Bool
可以使用普通运算符(&&)
( infixr 3
)和(||)
( infixr 2
)
列表上的差异尤其有害。 instance Eq a => Eq [a]
,因此为了在列表上使用==
,您需要知道列表元素也可以进行相等比较。 即使仅检查(== [])
。 [] == []
实际上会导致错误,因为编译器无法确定元素的类型。 这里没关系,但是如果您说,例如nonEmpty xs = xs /= []
,您将得到nonEmpty :: Eq a => [a] -> Bool
而不是nonEmpty :: [a] -> Bool
,因此nonEmpty [not]
在应为True
时会给出类型错误。
函数应用程序的优先级最高,并且是左关联的:
element x xs
读为((element x) xs)
element x tail xs
读为[ (((element x) tail) xs)
,在这里没有意义 f $ x = fx
,但是它是infixr 0
,这意味着它基本上颠倒了规则,并且在其正确的参数周围就像一大套括号
element x $ tail xs
读为((element x) (tail xs))
, 中缀函数的优先级始终低于前缀应用程序:
x `element` tail xs
意思也是((element x) (tail xs))
let decls in expr
中的let decls in expr
是一个表达式 。 decls
仅在expr
内的作用域内,并且整个事物的计算结果均decls
expr
评估的结果。 在顶层没有意义。
Haskell使用缩进来构造代码,例如Python。 参考
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.