F#中的嵌套列表

时间:2014-04-22 14:27:51

标签: f# functional-programming

我不确定这是否是一个愚蠢的问题,但我在F#中的列表上做了一些简单的问题。我无法处理嵌套列表。我的问题是,当我将列表声明为函数的参数时,为什么我无法传递嵌套列表?我的意思是嵌套列表也是一个列表。区分简单的int或char列表与列表列表有什么好处?

3 个答案:

答案 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;使用简单的包装器类型的任意深度。