2014-10-28 1 views
1

У меня есть следующие функции:Haskell - Нелегальная литерал ошибки типа в определении функции

replace :: a -> Int -> [a] -> [a] 
replace elem 0 x:xs = elem : xs 
replace elem i x:xs = x ++ replace elem (i - 1) xs 

И GHCi говорит мне, что у меня есть нелегальный литерал ошибки типа, а именно на буквальном 0 в первом определении , Теперь я знаю, что если я пытаюсь заменить произвольный элемент в списке, я не должен использовать структуру данных списка. Это прекрасно, поскольку я планирую реорганизовать свою программу, как только смогу получить то, что хочу работать.

Что касается жалобы компилятора, я не совсем уверен, почему Haskell полагает, что я пытаюсь определить тип здесь. Любая помощь с этим будет высоко оценена.

+0

Записать '(x: xs)' вместо 'x: xs' в шаблоне и' x: 'вместо' x ++ '. Я не уверен, почему он жалуется на типовые литералы - когда я его компилирую, я получаю «синтаксическую ошибку в шаблоне: заменить», что и следовало ожидать. – user2407038

+0

@ user2407038 ваш комментарий - это ответ, поэтому он должен быть действительно опубликован как таковой. –

ответ

3

Как @ user2407038 упоминалось есть две прямые проблемы с вашим кодом - вы mising скобки и использовать (++) вместо (:) - вы можете решить эту проблему следующим образом:

replace :: a -> Int -> [a] -> [a] 
replace elem 0 (x:xs) = elem : xs 
replace elem i (x:xs) = x : replace elem (i - 1) xs 

но делать это все еще оставит вас лишь частичное определение, как вы не подходите пустые списки a с (и GHC сообщит Вам об этом с предупреждением) - для решения этой проблемы просто добавить недостающий случай:

replace :: a -> Int -> [a] -> [a] 
replace _ _ []  = [] 
replace elem 0 (x:xs) = elem : xs 
replace elem i (x:xs) = x : replace elem (i - 1) xs 

, наконец, вы можете удали ве некоторые неиспользуемые привязок (переменные) и переименовать elem (уже определяемом в прелюдии), чтобы сделать GHC еще более счастливым (-Wall):

replace :: a -> Int -> [a] -> [a] 
replace _ _ []  = [] 
replace el 0 (_:xs) = el : xs 
replace el i (x:xs) = x : replace el (i - 1) xs 
0

Я решил проблему путем удаления одного пустого пространства отступа. Я считаю, что компилятор думал, что этот сегмент кода был частью предыдущего (несвязанного) выражения. Кроме того, я принял совет комментатора и заменил x ++ на x :

+0

Да, определения верхнего уровня считаются находящимися в блоке 'where' (начинаются с (необязательного) объявления' module') и должны иметь отступы одинаковой суммы. –

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

  • Нет связанных вопросов^_^