我是 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 吗?非常感谢!
我是 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 吗?非常感谢!
让我们一步一步来。的类型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'所有元素,以将列表减少为一个值。