gpt4 book ai didi

haskell - 根据条件对列表进行分区的函数 - Haskell

转载 作者:行者123 更新时间:2023-12-02 10:52:29 28 4
gpt4 key购买 nike

我正在学习 Haskell,我正在做的练习之一是创建一个函数,根据函数的返回值将列表划分为三个列表,以便函数值相等时获得第一个子列表为 1,函数值的第二个子列表为 2,第三个子列表包含其他所有内容。

读取函数声明

partition3 :: (a -> Int) -> [a] -> ([a], [a], [a])
partition3 _ [] = []

作为入门示例,请考虑

partition3 (\x -> mod x 5) [1..10] = ([1,6], [2,7], [3,4,5,8,9,10])

现在,我已经编写了函数filterAnyisSuitableremoveIfisNotSuitable。完整代码如下:

filterAny :: [a -> Bool] -> [a] -> [a]
filterAny _ [] = []
filterAny ps (x:xs)
| isSuitable ps x = x : filterAny ps xs
| otherwise = filterAny ps xs

isSuitable :: [a -> Bool] -> a -> Bool
isSuitable [] _ = False
isSuitable (p:ps) v
| p v = True
| otherwise = isSuitable ps v

removeIf :: [a -> Bool] -> [a] -> [a]
removeIf _ [] = []
removeIf ps (x:xs)
| isNotSuitable ps x = x : removeIf ps xs
| otherwise = removeIf ps xs

isNotSuitable :: [a -> Bool] -> a -> Bool
isNotSuitable [] _ = True
isNotSuitable (p:ps) v
| p v = False
| otherwise = isNotSuitable ps v

使用这些函数,我们可以获得 partition3 所需的输出:

filterAny [(\x -> mod x 5 == 1)] [1..10] = [1,6]
filterAny [(\x -> mod x 5 == 2)] [1..10] = [2,7]
removeIf [even, (\x -> x > 5)] [1..10] = [3,4,5,8,9,10]

不幸的是,我还没弄清楚如何编写这个函数来输出 ([1,6], [2,7], [3,4,5,8,9,10])

最佳答案

考虑“创建”像 (a,b,c) 这样的类型的值的一种高级方法是考虑“构造”它的方式,就像构造函数。在本例中,(a,b,c) 有一个构造函数 (_,_,_)。因此,您需要考虑要在第一个槽中放入什么东西,要在第二个槽中放入什么东西,以及要在第三个槽中放入什么......然后就完成了。

所以让我们这样概述我们的函数:

partition3 :: (a -> Int) -> [a] -> ([a], [a], [a])
partition3 f xs = (_, _, _)

我们知道最终答案的形式为(_,_,_),其中“空白”包含我们想要放入元组中的每个项目。让我们为每个空白指定一个有用的名称。

partition3 :: (a -> Int) -> [a] -> ([a], [a], [a])
partition3 f xs = (equalsOne, equalsTwo, theRest)
where
equalsOne = ???
equalsTwo = ???
theRest = ???

现在您只需要 equalsOne 成为 xs 中与您想要的属性相匹配的项,等等。equalsOne 的属性是“如果当您将 f 应用于它时,它给出 1”,则值 x 匹配。因此,让我们使用 filterAny 来编写它:

partition3 :: (a -> Int) -> [a] -> ([a], [a], [a])
partition3 f xs = (equalsOne, equalsTwo, theRest)
where
equalsOne = filterAny [\x -> f x == 1] xs
equalsTwo = ???
theRest = ???

在这里,我们过滤 xs 中的任何项目,如果您对其应用 f,则会给出 1

你能想出同样的方法来实现 equalsTwotheRest 吗?

关于haskell - 根据条件对列表进行分区的函数 - Haskell,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58895474/

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