我不确定这是否是一个愚蠢的问题,但我在F#中的列表上做了一些简单的问题。我无法处理嵌套列表。我的问题是,当我将列表声明为函数的参数时,为什么我无法传递嵌套列表?我的意思是嵌套列表也是一个列表。区分简单的int或char列表与列表列表有什么好处?
答案 0 :(得分:4)
如果函数是通用函数并且接受参数'a list
,则'a
的类型也可以是列表。因此,该函数可以使用列表,列表列表或列表列表列表......只要外部类型是列表,'a
可以是任何内容。
例如:
let isNonEmpty = function
| [] -> false
| _::_ -> true
isNonEmpty [1; 2; 3]
isNonEmpty [[1]; [2]; [3]]
如果你的函数不依赖于特定类型的列表元素,那么它应该是通用的。如果你发布你的代码,也许有人可以提供帮助。
flatten
函数的简单版本,不使用内置函数,可能是:
let flatten lst =
let rec helper = function
| [] -> []
| h::tl ->
match h with
| Elem x -> x::helper tl
| List xs -> helper xs @ helper tl
helper [lst]
答案 1 :(得分:3)
如果您的功能需要list<char>
并且您有list<list<char>>
这些类型并不匹配。但是,有一个函数List.concat将会“变平”&#34;列表清单。
所以:
let list = [ ['a'] ; ['b'] ]
let list' = list |> List.concat // [ 'a' ; 'b' ]
答案 2 :(得分:0)
对于正在寻找更多动态类型嵌套列表行为的人,您应该看看我的NestedPair模块:
https://gist.github.com/calebh/45871d3d40dc93526b3fd227cd577467
此模块允许&#34;列表&#34;使用简单的包装器类型的任意深度。