Предыстория: я занимаюсь расследованием анонимной рекурсии, и я беру на себя задачу реализации прелюдии без использования какой-либо именованной рекурсии просто для того, чтобы все это было в моей памяти.Я еще не совсем там, и по пути я столкнулся с чем-то не связанным, но все еще интересным.
map1 = \f -> \x -> if (tail x) == []
then [f (head x)]
else f (head x) : (map1 f (tail x))
map2 f x = if (tail x) == []
then [f (head x)]
else f (head x) : (map2 f (tail x))
map3 f (x:xs) = if xs == [] then [f x] else f x : (map3 f xs)
map4 f (x:[]) = [f x]
map4 f (x:xs) = f x : map4 f xs
GHC жалуется на первое, хорошо со вторым, третьим и четвертымЯ просто хочу показать, как они могут быть реализованы по-разному.
*Main> map1 (*2) [1..10]
<interactive>:1:15:
No instance for (Num ())
arising from the literal `10'
Possible fix: add an instance declaration for (Num ())
In the expression: 10
In the second argument of `map1', namely `[1 .. 10]'
In the expression: map1 (* 2) [1 .. 10]
*Main> map2 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> map3 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
*Main> map4 (*2) [1..10]
[2,4,6,8,10,12,14,16,18,20]
Если я добавлю сигнатуру типа в map1, все будет хорошо.
map1 :: Eq a => (a -> b) -> [a] -> [b]
Первые две функции кажутся в значительной степениТо же самое для меня, поэтому я полагаю, что мой вопрос просто «Что здесь происходит?»