Haskell简单的If-then-else错误

时间:2018-06-28 14:37:54

标签: haskell if-statement

我对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语句的“输入时解析错误”。怎么了?

2 个答案:

答案 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)

请注意,thenelse分支都是相同类型的表达式。

每个定义的类型均为summ :: Num t => [t] -> t