Haskell数字列表处理

时间:2018-03-03 20:26:38

标签: haskell

我无法解决此问题。任何可能的解决方案的提示将不胜感激。

给定DoublevDouble值列表xscalcList会返回Double个列表 根据以下规则:

  1. 对于x中的每个值xs,如果x不为正,则输出列表中将没有相应的值。

  2. 否则,相应的输出值将为x * ln x

  3. 但是,当且仅当其值大于v时,此值才会出现在输出列表中。

  4. 相应输出值(如果存在)的顺序应与输入相同 值。

  5. 以下是一些例子:

    calcList 1.0 [] = []
    calcList 1.0 [3.0] = [3.2958]
    calcList 1.0 [-1.0, 1.0, 3.0, 5.0, 7.0, 9.0] = [3.2958, 8.0472, 13.6214, 19.7750]
    calcList 100.0 [1.0 .. 40.0] = [102.0359, 106.4536, 110.9035, 115.3847, 119.8963, 124.4372, 129.0067, 133.6040, 138.2283, 142.8789, 147.5552]
    

    这是我到目前为止所做的:

    positive :: Double -> Bool
    positive x = x > 0.0
    
    calcValue :: Double -> Double
    calcValue x = log x * x
    
    calcList :: Double -> [Double] -> [Double]
    calcList v xs = []
    calcList v xs
    

3 个答案:

答案 0 :(得分:5)

所以看起来有3个步骤。

  1. 摆脱元素< = 0(filter
  2. 将每个剩余元素乘以其自然日志(map
  3. 摆脱元素< = vfilter
  4. 我们可以使用(.)(从f.g == \x -> f (g x)开始)来组合函数,而不是将每个应用于输入。

    calcList = \v -> filter (>v) . map (\x -> x*log x) . filter (>0)
    

    您应该查看filtermap上的文档。来自了解你一个Haskell this chapter也是一个很好的阅读。

答案 1 :(得分:2)

我们可以使用我们使用filtermap等函数的方法。使用 list comprehension

可以获得等效的解决方案
calcList :: (Ord d, Floating d) => d -> [d] -> [d]
calcList v xs = [xlogx | x <- xs, x > 0, let xlogx = x * log x, xlogx > v]

我们在这里使用x <- xs来迭代xs中的元素,通过使用x > 0我们过滤值,使得只考虑x > 0的值。接下来,我们将变量xlogx定义为let xlogx = x * log x,然后我们有一个额外的过滤器来检查xlogx > v

列表推导的yield部分(管道char |之前的部分)指定我们将xlogx添加到列表中。

答案 2 :(得分:0)

另一种方法可能是

Config resultante = new Config(Arrays.copyOf(dada.tabela, dada.tabela.length));

在每个calcList :: Double -> [Double] -> [Double] calcList v [] = [] calcList v (x:xs) = case (positive x) of { False -> calcList v xs; True -> case ((calcValue x) > v) of { False -> calcList v xs; True -> (calcValue x):(calcList v xs); }; } 中检查其中一个条件,再加上在列表开头添加数字,这样订单就会相同。