我对Haskell和程序设计真的很陌生。我试图不使用Data.List中的sum
函数来添加列表的内容。这是到目前为止我得到的:
module Summ
where
summ :: [Int] -> Int
summ xs =
if null xs == False
then let y = x + (head xs)
let xs = tail xs
else print y
我敢肯定这段代码有很多错误,但是目前最新的错误是else
语句的“输入时解析错误”。怎么了?
答案 0 :(得分:4)
let
表达式的语法为let BINDINGS in EXPRESSION
,例如
let x = 21 in x + x
它可能在抱怨else
,因为它希望看到in
。
有一种let
不带in
的形式,但仅适用于do
块(或列表推导)。
答案 1 :(得分:4)
在我看来,这不太正确。 print
返回IO ()
,而不是Int
,并且let
部分似乎根本没有表达式,并且x
没有定义。您是否在尝试编写递归函数?
summ [] = 0
summ (x:xs) = x + summ xs
递归不是语法;这仅使用两个具有模式匹配的部分函数定义。其中之一再次调用summ
,这是递归,并且最终(给定一个有限列表)该调用将导致更简单的非递归函数。该模式还将列表分解为头和尾,因此功能等效于:
summ xs = if null xs
then 0
else head xs + summ (tail xs)
请注意,then
和else
分支都是相同类型的表达式。
每个定义的类型均为summ :: Num t => [t] -> t