我需要将列表拆分为所有可能元组的列表,但我不确定如何这样做.
例如:
pairs ["cat","dog","mouse"]
Run Code Online (Sandbox Code Playgroud)
应该导致:
[("cat","dog"), ("cat","mouse"), ("dog","cat"), ("dog","mouse"), ("mouse","cat"), ("mouse","dog")]
我能够形成前两个,但我不确定如何得到其余的.
这是我到目前为止所拥有的:
pairs :: [a] -> [(a,a)]
pairs (x:xs) = [(m,n) | m <- [x], n <- xs]
Run Code Online (Sandbox Code Playgroud) {-# LANGUAGE DeriveFoldable #-}
{-# LANGUAGE DeriveFunctor #-}
{-# LANGUAGE DeriveTraversable #-}
import Control.Comonad
import Data.Functor.Reverse
import Data.List (unfoldr)
Run Code Online (Sandbox Code Playgroud)
首先是一些背景(哈哈).我在非空列表上有拉链.
data LZipper a = LZipper (Reverse [] a) a [a]
deriving (Eq, Ord, Show, Read, Functor, Foldable, Traversable)
mkZipper :: a -> [a] -> LZipper a
mkZipper = LZipper (Reverse [])
Run Code Online (Sandbox Code Playgroud)
你可以沿着拉链向两个方向走,但你可能会掉头.
fwd, bwd :: LZipper a -> Maybe (LZipper a)
fwd (LZipper _ _ []) = Nothing
fwd (LZipper (Reverse xs) e (y:ys)) = Just $ LZipper …Run Code Online (Sandbox Code Playgroud) 假设我有
DTl : D T -> T DcomonadD对 monad的分配法则T。我如何定义 comonad D T?