我无法解决此问题。任何可能的解决方案的提示将不胜感激。
给定Double
值v
和Double
值列表xs
,calcList
会返回Double
个列表
根据以下规则:
对于x
中的每个值xs
,如果x
不为正,则输出列表中将没有相应的值。
否则,相应的输出值将为x * ln x
。
但是,当且仅当其值大于v
时,此值才会出现在输出列表中。
相应输出值(如果存在)的顺序应与输入相同 值。
以下是一些例子:
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
答案 0 :(得分:5)
所以看起来有3个步骤。
filter
)map
)v
(filter
)我们可以使用(.)
(从f.g == \x -> f (g x)
开始)来组合函数,而不是将每个应用于输入。
calcList = \v -> filter (>v) . map (\x -> x*log x) . filter (>0)
您应该查看filter
和map
上的文档。来自了解你一个Haskell 的this chapter也是一个很好的阅读。
答案 1 :(得分:2)
我们可以使用我们使用filter
和map
等函数的方法。使用 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);
};
}
中检查其中一个条件,再加上在列表开头添加数字,这样订单就会相同。