将List中的相邻元素放入元组中

Ana*_*tol 0 haskell purescript

给出一个元素列表:

xs = [a, b, c, d, ... z]
Run Code Online (Sandbox Code Playgroud)

其中a, b, cetc是任意值的占位符.我想实现一个adjacents :: [a] -> [(a, a)]生成的函数

adjacentValues = [(a, b), (b, c), (c, d), ... (y, z)]
Run Code Online (Sandbox Code Playgroud)

在Haskell中,递归定义相当简洁:

adjacents :: [a] -> [(a, a)]
adjacents (x:xs) = (x, head xs) : adjacents xs
adjacents [] = []
Run Code Online (Sandbox Code Playgroud)

Purescript有点冗长:

adjacents :: forall a. List a -> List (Tuple a a)
adjacents list = case uncons list of 
    Nothing -> []
    Just {head: x, tail: xs} -> case head xs of
                                     Just next -> Tuple x next : adjacents xs
                                     Nothing -> []
Run Code Online (Sandbox Code Playgroud)

有没有一种方法可以表达adjacents没有明确的递归(使用折叠)?


免责声明:这个问题同时包含Purescript和Haskell标签,因为我想向更广泛的受众开放.我认为答案不依赖于haskells懒惰评估语义,因此在两种语言中都有效.

Naz*_*iuk 7

在Haskell中,没有显式递归,您可以使用其尾部压缩列表.

   let a = [1,2,3,4,5,6,7,8,9,0]

   a `zip` tail a

   => [(1,2),(2,3),(3,4),(4,5),(5,6),(6,7),(7,8),(8,9),(9,0)]
Run Code Online (Sandbox Code Playgroud)

  • `tail`在空列表上崩溃.````zip` drop 1 a``是避免这种情况的一种方法. (3认同)