Haskell - Как увеличить целочисленный аргумент в функции? - PullRequest
0 голосов
/ 04 мая 2020

Haskell newb ie здесь! Я пытаюсь запустить несколько тестов для созданной мной функции, которая принимает и выводит другое число. (Это простой пример функции).

nextNum :: Int -> Int
nextNum n = n+1

Однако в моем main я не хочу постоянно печатать свою функцию с помощью

print $ nextNum 0
print $ nextNum 1
print $ nextNum 2

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

print $ nextNum (\x -> [0..4])

Ответы [ 3 ]

6 голосов
/ 04 мая 2020

Это забавное введение в функциональное мышление об императивных действиях. Один из способов думать об этом состоит в том, что вы хотите создать список действий :

let actions = [ print (nextNum 0), print (nextNum 1), ... ] 

Это ничего не значит , делает , но просто дает перечислите имя actions. Мы используем функцию sequence_ (обратите внимание на подчеркивание), чтобы фактически выполнить действия:

sequence_ actions

Вы можете составить свой список действий с пониманием списка:

main = do
    let actions = [ print (nextNum n) | n <- [0..4] ]
    sequence_ actions

И из Конечно, вы можете «встроить» переменную actions:

main = sequence_ [ print (nextNum n) | n <- [0..4] ]

Подчеркивание после sequence_ состоит в том, чтобы отличать его от sequence, который собирает возвращаемое значение каждого действия и возвращает их все в виде список. sequence_ просто игнорирует возвращаемое значение.

4 голосов
/ 04 мая 2020

Это на самом деле становится еще короче, поскольку mapM_ и map могут плавиться, как это:

mapM_ (print . nextNum) [0..4]
2 голосов
/ 04 мая 2020

Если вы хотите, чтобы он был короче, вы можете применить mapM_:

mapM_ print $ map nextNum [0..4] 

map nexNum [0..4] - это просто список, а затем mapM_ применяет monadi c print для каждого элемента и игнорирует результат, который в любом случае равен IO [()].

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...