我正在尝试使用F#在Richard Bird的功能算法设计珍珠中重写一些Haskell算法,并且遇到了我不理解的NullReferenceException.
Haskell算法:
unmerges :: [a] -> [([a], [a])]
unmerges [x,y] = [([x], [y]), ([y], [x])]
unmerges (x:xs) = [([x], xs), (xs, [x])] ++
concatMap (add x) (unmerges xs)
where add x (ys, zs) = [(x:ys, zs), (ys, x:zs)]
Run Code Online (Sandbox Code Playgroud)
...按预期工作:
*Main> unmerges [1,2]
[([1],[2]),([2],[1])]
*Main> unmerges [1,2,3]
[([1],[2,3]),([2,3],[1]),([1,2],[3]),([2],[1,3]),([1,3],[2]),([3],[1,2])]
Run Code Online (Sandbox Code Playgroud)
我的F#版本:
let concatMap f m = List.map (fun x -> f x) m |> List.concat
let rec unmerges (ints: 'a list) : ('a list * 'a list) list =
match …Run Code Online (Sandbox Code Playgroud)