gpt4 book ai didi

接受函数和列表并返回 bool 值的函数

转载 作者:行者123 更新时间:2023-12-01 09:46:17 25 4
gpt4 key购买 nike

我对 Haskell 和函数式编程非常陌生。我正在尝试执行以下任务:

创建一个函数,该函数接受一个函数和一个列表,如果该函数对列表中的至少一项返回 true,则返回 true,否则返回 false。应该多态地工作。

我已经搜索了很多方法,包括 Prelude 和 any 函数

any :: Foldable t => (a -> Bool) -> t a -> Bool

但是,我正在努力实现它们。这就是我所拥有的:

list = [2,3,45,17,78]

checkMatch :: Int -> Bool
checkMatch x
| x `elem` list = True
| otherwise = False

main = do
print (checkMatch 45)

关于如何使用 Prelude 或任何功能来完成此任务的任何帮助。不要只提供答案,请解释程序。问候。

最佳答案

好的。不是一个完整的答案,因为你想自己解决问题,而是一些提示。

我强烈建议您从编写类型签名开始,直到您获得一个可以编译和处理一些情况的 shell,然后填写函数定义。因此,让我们从正确的类型签名开始。

在 Haskell 中,如果你想要一个接受任何类型参数的函数,你可以用不同的小写名称命名每个类型,通常是一个字母。特定类型有大写字母,通用类型有小写字母。因此,接受任何类型参数并返回 Bool 的函数将具有类型签名 a -> Bool。对于你的第二个参数,你想要获取一些任意类型元素的列表。您希望将它的元素传递给您的函数,因此它必须包含与函数域相同的类型,我们称之为a。 (如果它可以容纳任何东西,我们会选择另一个小写名称,例如 b。)您将该列表类型写为 [a]。您想要返回一个 Bool

因此,您的类型签名应该是 (a -> Bool) -> [a] -> Bool。通常,当我们编写一个对列表进行操作的函数时,一个好的方法是尾递归,我们将列表分成它的头部和尾部(x:xs),做x,然后在 xs 上再次调用该函数,直到得到一个空列表为止。您的模式守卫走在正确的轨道上,因此您可以从以下骨架开始:

checkMatch :: (a -> Bool) -> [a] -> Bool
checkMatch _ [] = _
checkMatch f (x:xs) | f x = _
| otherwise = _

main :: IO()
main = do
let shouldBeFalse = [1,3,5,7,9] :: [Int]
let shouldBeTrue = [1..10] :: [Int]

print (checkMatch (== " ") []) -- Does the empty string contain a space?
print (checkMatch even shouldBeFalse)
print (checkMatch even shouldBeTrue)

如果你编译这个,GHC 会告诉你它在程序中发现了三个“漏洞”,分别是第 2、3 行等号右侧的三个 _ 符号4. (等号左边模式中的 _ 意思不同:当列表为空时我们不关心函数参数是什么。这是为什么?)它会还告诉您它需要填充每个孔的类型是返回 Bool 的表达式。它还将为您提供具有该类型的局部函数和变量的列表。如果您尝试部分填充其中一个孔,比如使用 f _checkMatch _ _,它会告诉您需要什么类型来填充新孔已创建。

用正确的程序逻辑填补所有的漏洞,你的程序就会运行。

关于接受函数和列表并返回 bool 值的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48045500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com