小编que*_*eue的帖子

输出L形矩阵时避免双重遍历

我正在尝试遍历L Shape中的 Lists 列表。例如:lShapedTraverse [[1,2,3],[4,5,6],[7,8,9]]将导致[[1,2,3,6,9],[4,5,8],[7]]

我有以下算法可以给出所需的输出:

lShapedTraverse :: [[a]] -> [[a]]
lShapedTraverse [] = []
lShapedTraverse [xs] = [xs]
lShapedTraverse (xs:xss) = let (rest, col) = ((map init xss), (map last xss))
                           in (xs ++ col) : lShapedTraverse rest
Run Code Online (Sandbox Code Playgroud)

这是遍历列表列表两次以获得init和,我认为可以使用可以在一次遍历中last完成的自定义函数来避免这种情况。initAndLast

我想看看我是否可以做一个更有效的实现和惯用的 Haskell。

haskell matrix nested-lists

7
推荐指数
1
解决办法
268
查看次数

Haskell:处理 IO 内部故障的常见模式 :: IO (Either String Int)

试图了解用于处理内部可能出现的故障的模式IO。如果它只是case像下面这样的 s,它可能是可以接受的,但是如果对一堆嵌套的IO (Either String Int)s进行嵌套,是否有处理此类类型的通用模式。例如,如果binfunctionDoSomething再次是 a(Either a b)并且在成功时获取值并再次用它做某事将是另一个这样的case。是否有我可以使用的高阶函数?我对 monad 转换器还不满意,不确定它们是否可以用来处理这个特定的 monad 堆栈。如果它们可以在这里使用,有没有办法在不使用它们的情况下做到这一点。

import Control.Monad

functionCreate :: Int -> IO (Either String Int)
functionDoSomething :: Int -> IO b

functionUse :: IO ()
functionUse = do
   created <- functionCreate 10
   case created of
      (Right v)        -> void $ functionDoSomething v
      _                -> return ()
Run Code Online (Sandbox Code Playgroud)

monads haskell

4
推荐指数
1
解决办法
524
查看次数

标签 统计

haskell ×2

matrix ×1

monads ×1

nested-lists ×1