我编写了以下函数:
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 严格适用于两个列表。我怎样才能做到这一点?
您可以利用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)
| 归档时间: |
|
| 查看次数: |
180 次 |
| 最近记录: |