编写一个返回列表运行总和的函数.例如,[1,2,3,5]是[1,3,6,11].我在下面编写这个函数,它可以返回列表中所有值的最终总和.那我怎么能逐个分开呢?
sumlist' xx=aux xx 0
where aux [] a=a
aux (x:xs) a=aux xs (a+x)
Run Code Online (Sandbox Code Playgroud) ghci> zipWith' (zipWith' (*)) [[1,2,3],[3,5,6],[2,3,4]] [[3,2,2],[3,4,5],[5,4,3]]
Run Code Online (Sandbox Code Playgroud)
函数zipWith'使用函数'*'和它之后的参数得到返回.但在这种情况下,函数zipWith如何得到结果[[3,4,6],[9,20,30],[ [10,12,12]].
使用zipWith'的代码示例是从免费在线书籍Learn You a Haskell for Great Good中逐字逐句获取的.
uncurry f=\(a,b)->f a b
Run Code Online (Sandbox Code Playgroud)
uncurry将curried函数转换为对上的函数,但上面的函数只是将它转换为curried函数f a b.这与uncurry函数的定义是否相矛盾?
如何编写一个带谓词f和列表的函数,xx如果fx对某些人来说是真的,那么它会重新出现x?xs吗?
例如:
ghci>exists (>2) [1,2,3]
True
Run Code Online (Sandbox Code Playgroud)
这是我写的功能:
exists :: (t->Bool)->[t]->Bool
exists f a []=error
exists f a (x:xs)
|if x?f a =True
|otherwise= x:f a xs
Run Code Online (Sandbox Code Playgroud)
我知道这不对,但我不知道为什么.我是否需要先编写此谓词函数f,然后在函数内部使用它exists.因为我真的不知道如何比较列表的一个元素和xs函数.
我正在使用这些功能:
cplus a b = a+b
ucplus(a, b) = a+b
Run Code Online (Sandbox Code Playgroud)
......做这个实验:
uncurry cplus=\(a, b) -> cplus a b
Run Code Online (Sandbox Code Playgroud)
(a,b)是函数的参数cplus,所以方程的右边实际上是在执行函数cplus a b.
为什么uncurry cplus等于等式的右边?