List 列表中最新的非空值
我最近开始学习Haskell,我希望您能帮助解决列表转换问题 我有一个自定义数据类型的列表,为这个论坛简化为字符串,我希望将其转换为用最近看到的值替换为Nothing值。见下文: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
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
可以更有效地完成这项工作。