功能程式的新手,我需要從串列中洗掉甚至索引的元素,到目前為止我只能創建一個從 1 到 n 的串列。串列:[1,2,3,4,5,6...100] 目標:[1,3,5,7,9...99]
main = do
input <- readLn :: IO Int
let a = input
let list=[1..a]
putStrLn $ show list
uj5u.com熱心網友回復:
您可以通過使用以1then3和 limit開頭的范圍來生成僅包含奇數元素的串列a:
main = do
input <- readLn :: IO Int
print [1, 3..a]
這將呼叫它enumFromThenTo :: Enum a => a -> a -> a -> [a],從而生成一個包含兩個步驟的串列。
您還可以使兩個函式相互遞回:
evens :: [a] -> [a]
evens [] = []
evens (_:xs) = odds xs
odds :: [a] -> [a]
odds [] = []
odds (x:xs) = x : evens xs
然后呼叫odds串列[1 .. 100]會產生:
Prelude> odds [1 .. 100]
[1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41,43,45,47,49,51,53,55,57,59,61,63,65,67,69,71,73,75,77,79,81,83,85,87,89,91,93,95,97,99]
并且evens可用于獲取偶數索引上的元素。
用一個簡單的示例串列稍微詳細說明這種相互遞回的樣子:
odds [1, 4, 2, 7, 9, 6]
1 : evens [4, 2, 7, 9, 6]
1 : odds [4, 7, 9, 6]
1 : 2 : evens [7, 9, 6]
1 : 2 : odds [9, 6]
1 : 2 : 9 : evens [6]
1 : 2 : 9 : odds []
1 : 2 : 9 : []
[1, 2, 9]
或者,如果您想洗掉偶數(甚至不是索引)的專案,您可以使用:
Prelude> filter odd [1, 4 .. 100]
[1,7,13,19,25,31,37,43,49,55,61,67,73,79,85,91,97]
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/387000.html
標籤:哈斯克尔
上一篇:如何從型別級串列生成術語級串列?
