Eat*_*cks 0 haskell pattern-matching
我试图从列表中取出一对的第一个和第二个元素,以便可以对其求和。这是我的代码,我不确定为什么会出错
func :: [(Double,Double)] -> (Double,Double)
func [(x, y)] = map fst (x,y)
Run Code Online (Sandbox Code Playgroud)
首先,让我们采用当前的无效定义:
func :: [(Double,Double)] -> (Double,Double)
func [(x, y)] = map fst (x,y)
Run Code Online (Sandbox Code Playgroud)
这有几处错误:
[(x, y)]仅与一个元素完全匹配的列表匹配。任何包含2个或更多元素的列表都将导致错误,因为它们不匹配。map不能应用于元组;它只能应用于列表。map在一个元组,fst必须直接应用于元组- fst (a, b)给人a,而map fst (a, b)没有意义。让我们看一些替代定义。
func_1 :: [(Double,Double)] -> (Double,Double)
func_1 list =
let fsts = [ a | (a, _) <- list ]
snds = [ b | (_, b) <- list ]
in (sum fsts, sum snds)
Run Code Online (Sandbox Code Playgroud)
这将分别从列表中提取每个第一个元素,然后从列表中提取每个第二个元素,然后将它们添加在一起。
func_2 :: [(Double,Double)] -> (Double,Double)
func_2 list =
let fsts = map fst list
snds = map snd list
in (sum fsts, sum snds)
Run Code Online (Sandbox Code Playgroud)
映射fst输入列表的每个元素,以获取列表中所有第一元素的列表。然后映射snd以对第二个元素执行相同的操作。
func_3 :: [(Double,Double)] -> (Double,Double)
func_3 [] = (0, 0)
func_3 ((a,b) : xs) =
let (a', b') = func_3 xs
in (a+a', b+b')
Run Code Online (Sandbox Code Playgroud)
有点不同的方法。Haskell中的列表是递归形成的:[a, b, c]等效于(a : (b : (c : [])))。这意味着我们可以使用模式匹配来获取列表的第一个元素以及列表的所有其他元素。此定义分为两个部分:
(0, 0)(基本情况)。[b, c]如果[a, b, c]给予,或者[]如果[a]给出),使用计算其总和func_3一遍,再放入第一个元素了。| 归档时间: |
|
| 查看次数: |
106 次 |
| 最近记录: |