首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从第一性原理而不是练习6中的"flipType“回答第18章,练习5,Haskell

如何从第一性原理而不是练习6中的"flipType“回答第18章,练习5,Haskell
EN

Stack Overflow用户
提问于 2019-12-30 21:36:00
回答 1查看 68关注 0票数 1

本练习是定义函数meh,我按如下方式完成:

代码语言:javascript
复制
meh :: Monad m => [a] -> (a -> m b) -> m [b]
meh input_list transform = concatMonads transformed_input
  where 
    transformed_input = fmap transform input_list

concatMonads :: Monad m => [m b] -> m [b]
concatMonads [] = pure []
concatMonads (first:rest) = (concatMonads rest) >>= (appendListToMonadContent first)

appendListToMonadContent :: Monad m => m b -> [b] -> m [b]
appendListToMonadContent cur to_append = fmap (\first -> first:to_append) cur

下一个练习是定义flipType :: Monad m => [m b] -> m [b],提示是"reuse meh“(很简单:flipType l = meh l id)。然而,我对问题5的回答使用了flipType,它只被称为concatMonads,所以很明显,我的做法与作者的意图不同。

不使用flipType如何定义meh

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-30 22:06:02

代码语言:javascript
复制
meh :: Monad m => [a] -> (a -> m b) -> m [b]

第一个参数可以是[],这很简单。

代码语言:javascript
复制
meh [] _ = pure []

主例应该执行f提供的操作,然后递归地meh列表的其余部分,并收集结果:

代码语言:javascript
复制
meh (x:xs) f = do
    r <- f x
    rs <- meh xs f
    pure (r:rs)

或者不使用do表示法:

代码语言:javascript
复制
meh (x:xs) f =
    f x >>= \r -> meh xs f >>= \rs -> pure (r:rs)

或者用Applicative术语表示:

代码语言:javascript
复制
meh (x:xs) f = (:) <$> f x <*> meh xs f
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59531785

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档