2016-05-03 4 views
1

Я делаю код, чтобы узнать длину списка, используя рекурсию, но есть много ошибок. Я очень новичок, и я не могу очень хорошо Haskell. Вот код:Как я могу улучшить свой код, чтобы узнать длину списка?

longListe :: [a] -> a 

longListe [] = error "Empty liste" 
longListe [x]= 1 
longListe n = 1 + longListe (n-1) 
main = print $ longListe 

и ошибки:

No instance for (Num a) arising from the literal ‘1’ 
    Possible fix: 
     add (Num a) to the context of 
     the type signature for longListe :: [a] -> a 
    In the expression: 1 
    In an equation for ‘longListe’: longListe [x] = 1 

4-1-a.hs:6:31: 
    No instance for (Num [a]) arising from a use of ‘-’ 
    In the first argument of ‘longListe’, namely ‘(n - 1)’ 
    In the second argument of ‘(+)’, namely ‘longListe (n - 1)’ 
    In the expression: 1 + longListe (n - 1) 

4-1-a.hs:7:8: 
    No instance for (Show ([a0] -> a0)) 
     (maybe you haven't applied enough arguments to a function?) 
     arising from a use of ‘print’ 
    In the expression: print 
    In the expression: print $ longListe 
    In an equation for ‘main’: main = print $ longListe 

может кто-то пожалуйста, помогите мне. Thanks

+0

Одна из проблем: вы делаете '(n-1)' где 'n'is список. Вы не можете выполнять целые операции над списком. – dvaergiller

+1

Зачем «longListe» поднимать ошибку вместо того, чтобы возвращать 0 для пустого списка? – chepner

ответ

5

Проблема заключается в определении типа вашей функции: longListe :: [a] -> a.

Он работает нормально, если вы позвоните по номеру longListe. Например, если вы вызываете longListe [1,2,3], то ввод будет [Int] -> Int.

Однако, если вы попытаетесь получить длину списка строк, этот тип станет [String] -> String. Это не, что вы хотите, так как вы хотите вернуть номер.

Ошибки вы получаете указать, что:

Нет экземпляра для (Num а), вытекающих из буквального «1»

Поскольку вы возвращаете номер и сделать числовые операции с вами ввода, компилятор ожидает, что a будет номером, поэтому ошибка, упомянутая (Num a).

Если вы изменили определение на longListe :: [a] -> Int, оно должно работать лучше (на самом деле оно по-прежнему не работает, но по другой причине, но я позволю вам попытаться решить это самостоятельно, так как это лучший способ узнать) ,

Кроме того, есть ли причина, по которой пустой список должен принимать ошибку, а не возвращать 0?

+0

Хммм ОК теперь приходят эти ошибки – posh

+0

4-1-a.hs: 3: 16: Не удалось совместить ожидаемый тип 'Int' с фактическим типом '[Char]' В выражении: «Empty liste» В уравнение для 'longListe': longListe [] = "Empty liste" 4-1-a.hs: 6: 8: Нет экземпляра для (Показать ([a0] -> Int)) (возможно, у вас нет достаточно применить аргументы к функции?) , возникающие из-за использования «print» В выражении: print В выражении: print $ longListe В уравнении для 'main': main = print $ longListe Ошибка, модули загружены : никто. – posh

+1

@posh Я предполагаю, что вы удалили 'error' в' longListe [] = ошибка «Empty liste» '. Теперь у вас есть несоответствие между вашими типами возврата. Иногда вы возвращаете число, иногда строку ('[Char]' эквивалентно 'String'). Вам нужно убедиться, что возвращаемые вами значения всегда одного типа. –

Смежные вопросы