Ape*_*lli 1 haskell functional-programming list
(我目前正在上 Haskell 在线课程,这是一个练习。我不是在寻找答案,而只是寻求一些关于如何继续进行的指示!)
我很难理解这个问题。在命令式语言中,我会简单地使用循环,但由于 Haskell 并没有真正的循环,所以我只能摸不着头脑。
我需要编写一个函数 nextIsGreater :: [Int] -> [Int] ,给定一个数字列表,生成一个包含输入列表中所有元素的列表,以便该元素后面跟着输入列表中更大的数字(下一个数字更大)。
这是我到目前为止所想出的。
nextIsGreater :: [Int] -> [Int]
nextIsGreater xs = [x | x <- init xs, y <- tail xs, x < y]
Run Code Online (Sandbox Code Playgroud)
到目前为止,如果列表中只有两个数字,它就有效。说 [0,5],它会按预期返回 [0]。如果我有,比如 [0,5,6],那么我的代码似乎会根据列表中的下一个数字检查 0,并在应该返回 [0,5] 时返回 [0,0,5]。我怎样才能比较每个相邻的数字?
不错的尝试,但是
[x | x <- init xs, y <- tail xs, x < y]
Run Code Online (Sandbox Code Playgroud)
对应于嵌套循环:您x从 中进行选择init xs,然后对于每个选择,您可以从 中选择所有可能的ytail xs选项。
为了使这个想法按预期工作,您需要使用{-# LANGUAGE ParallelListComp #-}或等效地压缩源代码:
nextIsGreater xs = [x | (x,y) <- zip (init xs) (tail xs), x<y]
Run Code Online (Sandbox Code Playgroud)
但有一种更简单的方法来获取两个连续元素的所有选择tails:
nextIsGreater xs = [x | (x:y:_) <- tails xs, x<y]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1196 次 |
| 最近记录: |