如何使用where语句?

时间:2013-10-20 13:28:04

标签: haskell

我是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吗?非常感谢!

1 个答案:

答案 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',以便将列表缩减为单个值。