繁体   English   中英

Haskell中的成员函数

[英]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返回有关xy相等性的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM