0

我是 Haskell 的新手。我有一段代码检查列表中是否包含整数。

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

我不明白代码是如何从“哪里”工作的。我知道 f' 是一个表达式,整个句子用于定义 f'。b 应该是布尔值,但为什么呢?x 等于 xs 吗?非常感谢!

4

1 回答 1

3

让我们一步一步来。的类型foldl

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

您的where语句定义了 function f',它接受两个值并返回第三个值。所以我们当时所知道的是f具有以下类型:

f' :: a -> b -> c

由于if ... then A else B需要两个分支具有相同的类型,因此得出的结论是您的函数将返回 a Bool(您的第一个分支返回True)。所以

f' :: a -> b -> Bool

但是第二个分支返回第一个参数。所以第一个参数也必须是 a Bool(否则你不能将它用于foldl,见上文)。

f' :: Bool -> b -> Bool

因为x == a,这表明x应该与 的类型相同a。如果我们知道看看myElem',我们看到那a是类型的Int,因此你的辅助函数f'有类型

f' :: Bool -> Int -> Bool

x定义中f'的 不等于xs。相反,它只是另一个变量。foldl将遍历xs并使用f'所有元素,以将列表减少为一个值。

于 2013-10-20T13:40:50.397 回答