我正在尝试遍历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。
试图了解用于处理内部可能出现的故障的模式IO
。如果它只是case
像下面这样的 s,它可能是可以接受的,但是如果对一堆嵌套的IO (Either String Int)
s进行嵌套,是否有处理此类类型的通用模式。例如,如果b
infunctionDoSomething
再次是 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)