2016-11-30 7 views
0

The Haskell Wikibook обеспечивает одинПравильная реализация foldl1

foldl1   :: (a -> a -> a) -> [a] -> a 
foldl1 f (x:xs) = foldl f x xs 
foldl1 _ []  = error "Prelude.foldl1: empty list" 

, что не работает. Я пытался скомпилировать эту версию этого:

myFoldl1   :: (a -> a -> a) -> [a] -> a 
mFoldl1 f (x:xs) = myFoldl1 f x xs 
myFoldl1 _ []  = error "Prelude.foldl1: empty list 

Я сначала подумал, что пропал без вести дело до конца раз и была проблема с печатал

foldl1 _ [x] = x 
foldl1 f (x:xs) = foldl (f x) xs 

Но это не будет работать либо. Я думаю, что проблема с типом идет глубже, но у меня нет достаточного понимания Хаскелла, чтобы думать дальше. Кто-нибудь может мне помочь?

+5

Определить, что «не работает». Вы получаете ошибку компиляции или ошибку времени выполнения или просто не можете завершить работу? Код, который вы предоставили, отлично работает на моем GHC. –

+0

С myFoldl1 я получаю ошибку компиляции «ошибка типа - объединение дало бы infinte type» – Tina

+0

Хм ... это очень странно. Это полное сообщение об ошибке? Если да, то какой компилятор вы используете? –

ответ

5
mFoldl1 f (x:xs) = myFoldl1 f x xs 

Вы сделали две ошибки при переименовании функции: во-первых вы опечатка имя функции в определении выше случае (mFoldl1 вместо myFoldl1) и во-вторых, вы заменили вызов foldl в оригинале с рекурсивный вызов myFoldl1.

Правильная версия будет:

myFoldl1 f (x:xs) = foldl f x xs 
+0

Thx для вас ответ, я уже объяснял в других комментариях, что я размещаю этот вопрос на другой машине (планшет, где я быстро делаю опечатки), и мне придется писать evrything снова. Я пытался отредактировать его, но он всегда показывает мне оргиничный пост? – Tina

+7

@ Тина Пожалуйста, не делайте этого. Если вы повторно набираете код (особенно таким образом, который подвержен опечаткам), вы просто заставляете людей тратить свое время (и ваше), сосредотачиваясь на ошибках, которые на самом деле не находятся в вашем коде. В будущем просто скопируйте и вставьте код с компьютера, на котором он находится, как только вы вернетесь перед ним (это не похоже на то, что вам понадобятся ответы до этого, так как они не будут вам полезны на вашем таблетка). В любом случае я бы сделал ставку на то, что, по крайней мере, вторая ошибка, о которой я говорил, действительно существует и в вашем реальном коде. Исправленный код, который я разместил, определенно работает. – sepp2k

1

я тоже наткнулся на ошибку в wikibook, и нашел эту запись.

Ответы, представленные выше, кажутся неправильными: они даже не имеют правильного типа.

foldl1 f [x]  = x 
fold11 f [x,y]  = f x y 
foldl1 f x:y:zs = f (f x y) (foldl1 f zs) 
foldl1 _ []  = error "foldl1 undefined on []" 

делает эту работу, я думаю. Надеюсь, что есть что-то более элегантное.

0

Коррекция! Выше работы, но оригинал с использованием вызова foldl намного лучше. Путаница возникает при использовании шрифтов, которые четко не различают «l» и «1»! Должно быть ясным

fold1 f (x:xs) = foldl f x xs 

- это очевидный и простой оригинал.

+0

Вы уверены, что не хотите редактировать свой оригинальный ответ, а не публиковать новый? – anonymoose

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