Haskell简单If-then-else错误

Haskell简单If-then-else错误,haskell,if-statement,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语

我对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语句输入时的parse error。怎么了?

let表达式的语法是表达式中的let绑定,例如

它可能是在抱怨其他的事情,因为它希望看到更多的东西


有一种形式的let-without-in,但它只适用于do块或列表理解。

我觉得不太合适。返回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

y类型,它在表达式的第一个分支中定义,但在第二个分支中使用。你期望发生什么?我在想我可以用y作为存储我用来添加列表元素的表达式的一种方式。我想不出另一种方法…看看,它将带你了解语法和问题解决的基础知识。我一直在自学这个和@haskellbook,还有其他好的资源吗?记住,你现在使用的是纯函数式语言。至少在通常意义上,没有存储或变量这样的东西。这是一个巨大的调整,但为了在Haskell中高效编程,你必须习惯这种范式转换。我以前见过递归语法,但我不知道它是如何工作的。你能详细说明一下吗?编辑:在我定义类型的第三行中,应该是IO而不是Int?@VeganJoy summ函数中不应该有IO。编译器可能会建议这样做,因为其中有一个错误的print调用,但您不想在summ函数中打印;你只需要返回值,让main打印出来,或者做它想做的任何事情。之前出现的一个错误是当我没有任何一个let时。还有什么替代方案可以继续执行这些操作?@VeganJoy你说的这些操作是什么意思?替代什么?我指的是let之后的表达式,在我使用它的两种情况下,我都不知道很多函数。我还能在那里使用什么,或者在这里适用吗?@VeganJoy我不知道你在那里想做什么。您将y定义为x和xs的第一个元素之和,但x不存在。然后将xs定义为它自己的尾巴。我不能告诉你该用什么来代替,因为我不明白你想做什么,也不知道这些对你总结清单有什么帮助。嗯。。。我不知道我对x的想法。我尝试获取列表的第一部分,将其添加到一个变量中,然后去掉xs的第一个元素并重复,直到它为空。一旦它是空的,我计划让它打印已添加到的变量。
summ xs = if null xs
          then 0
          else head xs + summ (tail xs)