如何在haskell中fmap元组的第一个元素

时间:2012-04-01 09:03:41

标签: haskell functor applicative

我正在尝试编写像

这样的函数
mapFst :: Maybe (a, String) -> Maybe ([a], String)
mapFst (a,s) = (:) <$> (a,s) <*> [other fun with same type as mapFst] (a,s)

在这里,我正在尝试基于元组的第一个元素构建一个列表,但我不确定如何继续。我可以为非元组执行此操作,但我不确定如何在此构造中使用fst(如果我应该首先使用该函数)。

此函数将与另一个相同类型的接口连接,但处理输入的方式略有不同。我需要使用fmap和ap,因为元组位于Maybe容器

2 个答案:

答案 0 :(得分:4)

你的问题并不清楚,但我认为你想要来自Control.Arrow的first

first (*1000) (3, 4)
>>> (3000, 4)

在您的编辑和dbaupp的答案的基础上,也许你想要

mapFst (a,s) = case otherFunc (a,s) of
                    Nothing -> ([a], s)
                    Just (as:s') -> (a:as, s')

答案 1 :(得分:2)

mapFst (a,s) = let (as, s') = otherFunc (a,s) in (a:as, s)

(目前尚不清楚您希望如何处理String:您可以将s更改为s's ++ s'或其他所需内容。)