[英]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.