簡體   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