我只是想知道是否有可能创建一个返回(希望是无限的)数字列表的函数.[1,[2,[3,[4]]]].
我得到的最接近的是这个.
func list 0 = list
func list num = func newList (num-1)
where newList = list ++ [[num]]
Run Code Online (Sandbox Code Playgroud)
这是用这样的.
func [] 3
Run Code Online (Sandbox Code Playgroud)
哪个回来了.
[[3],[2],[1]]
Run Code Online (Sandbox Code Playgroud)
现在我知道这不是无限的,也不是正确的顺序,但我只是想表明我至少在发布之前尝试了一些东西.:)
谢谢你!
您不能编写这样的函数,因为列表的所有元素必须具有相同的类型.即使仅有两个元素,您要创建的列表也不会进行类型检查:
Prelude> :t [1::Int,[2::Int]]
<interactive>:1:9:
Couldn't match expected type `Int' with actual type `[Int]'
In the expression: [2 :: Int]
In the expression: [1 :: Int, [2 :: Int]]
Run Code Online (Sandbox Code Playgroud)
第一个元素是Int,第二个元素是Int列表,因此类型检查失败.
虽然你可以用元组表达结果,例如
Prelude> :t (1::Int,(2::Int,(3::Int,4::Int)))
(1::Int,(2::Int,(3::Int,4::Int))) :: (Int, (Int, (Int, Int)))
Run Code Online (Sandbox Code Playgroud)
您仍然无法编写该函数,因为结果的类型将根据您希望拥有的元素数量而改变.我们称之为f假设函数:
f 1 :: (Int)
f 2 :: (Int,(Int))
f 3 :: (Int,(Int,(Int)))
...
Run Code Online (Sandbox Code Playgroud)
f随参数的变化类型,所以f无法写入.