本练习是定义函数meh,我按如下方式完成:
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
发布于 2019-12-30 22:06:02
meh :: Monad m => [a] -> (a -> m b) -> m [b]第一个参数可以是[],这很简单。
meh [] _ = pure []主例应该执行f提供的操作,然后递归地meh列表的其余部分,并收集结果:
meh (x:xs) f = do
r <- f x
rs <- meh xs f
pure (r:rs)或者不使用do表示法:
meh (x:xs) f =
f x >>= \r -> meh xs f >>= \rs -> pure (r:rs)或者用Applicative术语表示:
meh (x:xs) f = (:) <$> f x <*> meh xs fhttps://stackoverflow.com/questions/59531785
复制相似问题