Я делаю свою ежегодную попытку выучить Haskell в эти выходные, и, как и всегда, когда я пытаюсь написать рекурсивную функцию (а не просто набрать одну из учебника), я получаю ошибку типа.
Я бы очень признателен за любую помощь в понимании (1), что означает ошибка (я не понимаю "исправить"); и (2) почему вообще возникает ошибка - я совершенно уверен, что не делаю ошибок в отношении передаваемых типов.
Мой код:
tell :: (Show a) => [a] -> String
tell'in :: (Show a, Num n) => [a] -> n -> String -> (n, String)
tell [] = "The list is empty"
tell (x:[]) = "The list has one element: " ++ show x
tell (x:xs) = "The list has " ++ n ++ " elements: " ++ s where (n, s) = (tell'in (xs) (1) (show x))
tell'in (x:[]) n s = ((n + 1), (s ++ " and " ++ (show x)))
tell'in (x:xs) n s = tell'in xs (n+1) (s ++ " and " ++ show x)
И ошибка, которую я получаю, когда пытаюсь загрузить это в GHCI:
[1 of 1] Compiling Main ( example.hs, interpreted )
example.hs:13:88:
Could not deduce (Num [Char]) arising from the literal `1'
from the context (Show a)
bound by the type signature for tell :: Show a => [a] -> String
at example.hs:(11,1)-(13,99)
Possible fix:
add (Num [Char]) to the context of
the type signature for tell :: Show a => [a] -> String
or add an instance declaration for (Num [Char])
In the second argument of `tell'in', namely `(1)'
In the expression: (tell'in (xs) (1) (show x))
In a pattern binding: (n, s) = (tell'in (xs) (1) (show x))
Failed, modules loaded: none.
Prelude>