Haskell - zip 替代品

J. *_*dge 2 haskell

我编写了以下函数:

f :: String -> [(Int, Int)] 
f s = zip x y where
  x = g s 
  y = h s
Run Code Online (Sandbox Code Playgroud)

该函数g具有以下签名:

g :: String -> [Int]
Run Code Online (Sandbox Code Playgroud)

h

h :: String -> [Int]
Run Code Online (Sandbox Code Playgroud)

我想修改f它以便它返回[(Int, Int, String)]String它的输入在哪里s。我认为这里的问题是 zip 严格适用于两个列表。我怎样才能做到这一点?

Wil*_*sem 7

您可以利用zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]并因此使用从两个列表中获取元素并生成值的任意函数。

在这种特定情况下,我们可以例如使用 lambda 表达式:

f :: String -> [(Int, Int, String)]
f s = zipWith (\xi yi -> (xi, yi, s)) (g s) (h s)
Run Code Online (Sandbox Code Playgroud)

或者您可以使用TupleSections扩展名 [ghc-doc],并将其实现为:

{-# LANGUAGE TupleSections #-}

f :: String -> [(Int, Int, String)]
f s = zipWith (,,s) (g s) (h s)
Run Code Online (Sandbox Code Playgroud)

  • “zip3 (gs) (hs) (重复 s)”怎么样? (6认同)