Haskell простая ошибка If-then-else - PullRequest
0 голосов
/ 28 июня 2018

Я действительно новичок в Хаскеле и программировании в целом. Я пытаюсь добавить содержимое списка без использования функции sum из Data.List. Вот что у меня так далеко:

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 голосов
/ 28 июня 2018

Это выглядит не совсем правильно для меня. 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

0 голосов
/ 28 июня 2018

Синтаксис для выражения let: let <i>BINDINGS</i> in <i>EXPRESSION</i>, например,

let x = 21 in x + x

Вероятно, он жалуется на else, потому что ожидал увидеть in.

Существует форма let без in, но она работает только в do блоках (или списках).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...