我想在Haskell中创建自己的列表,在其中可以输入数字6并得到结果[1,2,3,4,5,6]
我以为我可以写类似的东西
ones :: Int -> [a]
ones 0 = []
ones n = [n, n-1 ... n==0]
有人可以帮我吗?
答案 0 :(得分:5)
有很多方法可以做到这一点。在非详尽列表下方。
您可以使用Haskells列表范围:
ones :: (Enum n, Num n) -> n -> [n]
ones n = [1 .. n]
您可以使用enumFromTo :: Enum a => a -> a -> [a]
函数:
ones :: (Enum n, Num n) -> n -> [n]
ones = enumFromTo 1
或者我们可以使用显式递归:
ones :: (Ord n, Num n) => n -> [n]
ones n = go 1
where go i | i <= n = i : go (i+1)
| otherwise = []
或通过使用iterate :: (a -> a) -> a -> [a]
和take :: Int -> [a] -> [a]
:
ones :: Num n => Int -> [n]
ones n = take n (iterate (1+) 1)
请注意,并非所有方法都具有相同的签名。某些实现不需要数字类型作为Enum
类型类的实例,从某种意义上来说,可以使函数更加灵活,因为无法枚举的数字类型仍可以得到处理。