2013-10-20 48 views
0

我是Haskell的新手。我有一段代碼檢查整數是否包含在列表中。如何使用where語句?

myElem' :: Int -> [Int] -> Bool 
myElem' a xs = foldl f' False xs 
    where f' b x = if x==a then True else b 

我不明白代碼是如何從'Where'工作的。我知道f'是一個表達式,整個習慣用來定義f'。 b應該是布爾值,但爲什麼? x等於xs嗎?非常感謝!

+0

請注意,它的工作方式是始終貫穿整個列表,即使該元素已經找到。 – Ingo

+0

@Ingo事實並非如此。試試'myElem'0 [undefined,0]',然後'myElem'1 [undefined,0]'。第一種情況返回'True'而不是給出錯誤,因爲它從不評估'undefined',因爲它是在第一次出現'0'之後。另外,where子句可以寫成'f'b x = a == x || b' – user2407038

回答

3

讓我們一步步走過去。該類型的foldl

foldl :: (a -> b -> a) -> a -> [b] -> a 

where語句定義功能f',這需要兩個值,並返回第三個。所以,我們都知道當時是f有以下類型:

f' :: a -> b -> c 

由於if ... then A else B需要兩個分支有相同的類型,這個結論是你的函數會返回一個Bool(你的第一個分支的回報True)。因此,

f' :: a -> b -> Bool 

但第二個分支返回第一個參數。所以第一個參數也必須是Bool(否則你不能在foldl中使用它,見上文)。

f' :: Bool -> b -> Bool 

由於x == a,這表明x應該是相同類型的a。如果我們知道看看myElem',我們看到aInt型的,因此您的輔助功能f'具有在f'的定義類型

f' :: Bool -> Int -> Bool 

x不等於xs。相反,它只是另一個變量。 foldl將遍歷xs並在所有元素上使用f',以便將列表減少爲單個值。

+0

非常感謝Zeta。你已經清楚了! :) – Peine