Haskell Пытаюсь заставить мою функцию foldl работать

У меня есть функция, которая преобразует [a, b, c, d, . . . ] до [(a,b), (c, d), . . .]. Теперь это работает, и вот код для этого:

makeTuple :: [a] -> [(a,a)]
makeTuple [] = []
makeTuple [a] = []
makeTuple (x:y:xs) = (x,y): (makeTuple xs)

Теперь следующее, что мне нужно сделать, это: используя предыдущую функцию, преобразовать каждый кортеж в произведение двух его элементов, используя foldl и лямбда-выражение. И вот что у меня есть:

productTuple [x] = foldl makeTuple [] [x]

Теперь я не уверен, что это именно то, о чем меня просят. Я не уверен, должен ли я сделать отдельную функцию с объявлением типа и еще много чего. Может быть, кто-то может сказать мне, если это лучший способ приблизиться к этому. Также этот код не работает, и я не знаю почему, мне нужна помощь с этой частью. (обратите внимание, что в нем говорится использовать лямбда, но я понятия не имею, как правильно их использовать, что является еще одной частью, с которой мне нужна помощь) Я был бы очень признателен, спасибо.


person lou tej    schedule 02.11.2017    source источник
comment
Кто сказал, что вы должны использовать функцию makeTuple?   -  person Willem Van Onsem    schedule 02.11.2017
comment
Вам, вероятно, придется реализовать пустой и минусовый случай productTuple, поэтому productTuple (x:xs) и productTuple [].   -  person altschuler    schedule 02.11.2017
comment
Подсказка: как бы вы использовали foldl, который принимает в качестве входных данных список, чтобы воссоздать этот список (по сути, это функция id)?   -  person Willem Van Onsem    schedule 02.11.2017
comment
связанные: stackoverflow.com/q/26017352/67579   -  person Willem Van Onsem    schedule 02.11.2017


Ответы (2)


Лямбда-функция должна учитывать эту подпись:

 [a] -> (b,b) -> [a]

Аккумулятор имеет тип [a], кортеж имеет тип (b,b)

Вы можете попробовать такую ​​лямбду \acc (a, b) -> acc++[a*b]

Окончательная функция может выглядеть так:

productTuple :: Num a => [a] -> [a]
productTuple xs = foldl (\acc (a, b) -> acc++[a*b]) [] (makeTuple xs)

У вас есть несколько примеров функции foldl здесь

Я попробовал этот код здесь

person Arno    schedule 02.11.2017

В упражнении вам предлагается предварительно обработать входные списки с помощью makeTuple, а затем свернуть их.

productTuple :: [Int] -> [Int]
productTuple xs = foldl (some lambda) something (makeTuple xs)

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

person chi    schedule 02.11.2017
comment
Ваше использование OP makeTuple приводит к ошибке типа: в качестве аргумента принимается только один список. - person gallais; 02.11.2017