2015-02-14 2 views
1

В программировании Haskell есть код функции сгиба.Функция Foldr и Foldl в haskell

map' ::(a->b)->[a]->[b] 
map' f xs=foldr(\x acc ->f x:acc)[] xs 

ВХОД:

map' (+3) [1,2,3] 

ВЫВОД:

[4,5,6] 

Он принимает элемент с правой стороны по причине foldr функции, и я хочу взять элемент с левой стороны и добавить в список и я хочу выход [6,5,4] .i сделал это через функцию foldl, но он дает ошибку.

ERROR: Couldn't match expected type `a' with actual type `[b]' 
     `a' is a rigid type variable bound by 
      the type signature for map' :: (a -> b) -> [a] -> [b] 
      at doubleme.hs:1:8 
    In the first argument of `f', namely `x' 
    In the first argument of `(:)', namely `f x' 
    In the expression: f x : acc 
+1

Какова была фактическая ошибка, которую вы получили? – thefourtheye

ответ

2

Изменить свою функциональную подпись на map' ::(a->b)->[a]->[b].

Операция map в основном принимает функцию, которая преобразует элемент типа «a» в элемент типа «b» и список элементов типа «a», чтобы создать список элементов типа «b» 'с использованием преобразующей функции. Ваша сигнатура функции, содержащая другой тип «c», противоречит этому, потому что «b» и «c» не могут подразумеваться как один и тот же тип.

Далее, чтобы использовать foldl, вы должны изменить порядок ваших входных параметров, например, так:

map' :: (a->b)->[a]->[b] 
map' f xs = foldl (\acc x ->f x:acc) [] xs 
+0

thanku, это works.but, как это правильно, и мой путь неправильный. –

+0

Взгляните на это, чтобы увидеть, как работают 'foldl' и' foldr', и вы увидите, почему вам нужно было поменять позиции ваших параметров: http://hackage.haskell.org/package/base-4.7.0.2 /docs/Prelude.html#v:foldl –

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