haskell - 如何在 [maybe string] 上使用 fmap,所以添加的字符串在 Just 之前?
问题描述
我有以下功能:
maybeStrings:: [Maybe String] -> [Maybe String]
maybeStrings s = fmap ("Hello, "++) <$> s
问题是,我怎样才能在 Just 之前得到那个“Hello”?例如,用户给出以下列表:[Just "Simpson"]
当前输出为[Just "Hello, Simpson"]
. 我希望它是:["Hello, Just Simpson"]
。
解决方案
我希望它是:
["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
部分返回一个字符串。您不能将String
s 和Maybe String
s 都存储在列表中。
@dopamane 建议的另一个明智的候选人正在使用catMaybes :: [Maybe a] -> [a]
. 这需要一个Maybe
s 列表并将Just
s 转换为项目列表。因此我们可以定义一个函数:
import Data.Maybe(catMaybes)
maybeStrings :: [Maybe String] -> [String]
maybeStrings = map ("Hello, " ++) . catMaybes
推荐阅读
- quarkus - Quarkus - 修改 JSESSIONID 属性
- python - 如何解释 model.predict 返回的结果?
- c - 在不阻塞当前执行的情况下从 ac 程序启动和停止 linux shell 命令
- javascript - webpack服务器运行时如何运行不同的html文件而不是index.html?
- c++ - 前端(React JS)到后端(C++)之间的连接
- sparql - wikidata 获取包含文字的实体 id
- go - 这些功能有什么区别?
- python - 在神经网络训练开始前得到一个 UnboundLocalError
- python - Python 3.7.7 SSL socketserver ConnectionResetError: [WinError 10054] 现有连接被远程主机强行关闭
- excel - 如何从 Excel 中的文本字符串中调用正确的数字?