Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 列表中最新的非空值_List_Haskell_Maybe - Fatal编程技术网

List 列表中最新的非空值

List 列表中最新的非空值,list,haskell,maybe,List,Haskell,Maybe,我最近开始学习Haskell,我希望您能帮助解决列表转换问题 我有一个自定义数据类型的列表,为这个论坛简化为字符串,我希望将其转换为用最近看到的值替换为Nothing值。见下文: Input: [Nothing, Just "Hello", Nothing, Nothing, Just "World", Nothing] Output: [Nothing, Just "Hello", Just "Hello", Ju

我最近开始学习Haskell,我希望您能帮助解决列表转换问题

我有一个自定义数据类型的列表,为这个论坛简化为字符串,我希望将其转换为用最近看到的值替换为Nothing值。见下文:

Input: [Nothing, Just "Hello", Nothing, Nothing, Just "World", Nothing]
Output: [Nothing, Just "Hello", Just "Hello", Just "Hello", Just "World", Just "World"]
这在哈斯克尔可能吗?任何提示都将不胜感激。

您可以试试这个

import Data.Maybe (isJust)

lastJust :: [Maybe String] -> [Maybe String]
lastJust = reverse . foldl foldFunc []
    where foldFunc xs Nothing = 
            case filter isJust xs of
                x:_ -> x:xs
                _ -> Nothing:xs
          foldFunc xs (Just x) = Just x:xs
这将折叠列表,如果它是一个
,它将返回一个
。如果它找到一个,它将用它替换它


我建议查找折叠,以及如何使用折叠来处理严格的数据

import Control.Applicative

f = scanl1 (flip (<|>))
导入控件。应用程序
f=scanl1(翻转())

f[w,x,y,z]
会产生
[w,xw,yxw,zyxw]
,并且用
链接
可能会给你第一个
只是
,,或者
Nothing
如果它们都是
Nothing

您可以尝试使用递归来实现这一点。您可能会发现简单的递归方法不太管用。另外一个提示是创建一个helper函数来执行递归,并将输入列表和一个附加参数一起传递给该helper函数:最近看到的值。谢谢!我将对此进行研究。您的输出类型没有反映这样一个事实,即在第一个
之后不可能有任何
Nothing
s。这似乎不太令人满意。你想要这个函数做什么?为人们编写代码剥夺了他们的学习机会。@4castle我已经解决了这个问题,为什么你要用
foldl
而不是
foldr
?因为它是从左到右的。从之前的元素开始,是吗?无论如何,使用
foldr
可以更有效地完成这项工作。