我是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嗎?非常感謝!
我是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嗎?非常感謝!
讓我們一步步走過去。該類型的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'
,我們看到a
是Int
型的,因此您的輔助功能f'
具有在f'
的定義類型
f' :: Bool -> Int -> Bool
的x
不等於xs
。相反,它只是另一個變量。 foldl
將遍歷xs
並在所有元素上使用f'
,以便將列表減少爲單個值。
非常感謝Zeta。你已經清楚了! :) – Peine
請注意,它的工作方式是始終貫穿整個列表,即使該元素已經找到。 – Ingo
@Ingo事實並非如此。試試'myElem'0 [undefined,0]',然後'myElem'1 [undefined,0]'。第一種情況返回'True'而不是給出錯誤,因爲它從不評估'undefined',因爲它是在第一次出現'0'之後。另外,where子句可以寫成'f'b x = a == x || b' – user2407038