首页 > 解决方案 > 如何在 [maybe string] 上使用 fmap,所以添加的字符串在 Just 之前?

问题描述

我有以下功能:

maybeStrings:: [Maybe String] -> [Maybe String]
maybeStrings s = fmap ("Hello, "++) <$> s

问题是,我怎样才能在 Just 之前得到那个“Hello”?例如,用户给出以下列表:[Just "Simpson"]当前输出为[Just "Hello, Simpson"]. 我希望它是:["Hello, Just Simpson"]

标签: haskellmaybe

解决方案


我希望它是:["Hello, Just Simpson"]

我认为这是一个错字,并且您想要:

["Hello", Just "Simpson"]

然而这是不可能的。列表包含所有类型相同的元素。但是在这里,您的列表将包含 aString和 a Maybe String,这没有多大意义。

如果您想在列表前面加上Just "Hello",可以在此处使用运算符分段:

maybeStrings :: [Maybe String] -> [Maybe String]
maybeStrings s = (Just "Hello" :)

如果要将 转换为 string ,可以使用如下映射:Just x"Hello, Just

maybeStrings :: [Maybe String] -> [String]
maybeStrings = map f
    where f (Just x) = "Hello, "  x
          f Nothing = _

但随后您需要为该Nothing部分返回一个字符串。您不能将Strings 和Maybe Strings 都存储在列表中。

@dopamane 建议的另一个明智的候选人正在使用catMaybes :: [Maybe a] -> [a]. 这需要一个Maybes 列表并将Justs 转换为项目列表。因此我们可以定义一个函数:

import Data.Maybe(catMaybes)

maybeStrings :: [Maybe String] -> [String]
maybeStrings = map ("Hello, " ++) . catMaybes

推荐阅读