我是 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'
所有元素,以将列表减少为一个值。