我是Haskell的新手。我有一段代码检查列表中是否包含整数。
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 :(得分: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'
,我们会看到a
的类型为Int
,因此您的辅助函数f'
的类型为
f' :: Bool -> Int -> Bool
x
定义中的f'
不等于xs
。相反,它只是另一个变量。 foldl
将遍历xs
并对所有元素使用f'
,以便将列表缩减为单个值。