我知道这个length功能,但如果我有一个列表,[(1,2),(2,3),(3,4)]并尝试使用length它不起作用.我试图连接,但这没有帮助.知道怎么样?
虽然(2 *) . length正如9000所指出的那样,对你当前问题的明智解决方案是值得关注为什么length [(1,2),(2,3),(3,4)]不做你期望的事情.Haskell列表包含任意数量的相同类型的元素.然而,Haskell对恰好有两个可能不同类型的元素,这些元素是完全不同的,并且不会隐式转换为列表(有关该点的进一步讨论,请参阅此问题).但是,没有什么能阻止我们自己编写转换函数:
pairToList :: (a, a) -> [a]
pairToList (x, y) = [x, y]
Run Code Online (Sandbox Code Playgroud)
注意,参数pairToList是类型(a, a); 也就是说,该函数只接受具有相同类型的两个元素的对.
鉴于pairToList,我们可以转换列表中的对...
GHCi> map pairToList [(1,2),(2,3),(3,4)]
[[1,2],[2,3],[3,4]]
Run Code Online (Sandbox Code Playgroud)
......然后按原计划继续进行:
GHCi> (length . concat . map pairToList) [(1,2),(2,3),(3,4)]
6
Run Code Online (Sandbox Code Playgroud)
该concatMap功能结合map并concat一次性通过......
GHCi> :t concatMap
concatMap :: Foldable t => (a -> [b]) -> t a -> [b]
Run Code Online (Sandbox Code Playgroud)
......所以你的功能变得简单:
GHCi> (length . concatMap pairToList) [(1,2),(2,3),(3,4)]
6
Run Code Online (Sandbox Code Playgroud)