Functional programming 二叉树作为无归属对

Functional programming 二叉树作为无归属对,functional-programming,binary-tree,sml,Functional Programming,Binary Tree,Sml,我试图将一个通用的二叉树表示为一对 我将使用SML语法作为示例。这是我的btree类型定义: datatype btree = leaf | branch of btree*btree; 因此,我想编写一个函数,给定一个btree,打印以下内容: bprint leaf = 0 bprint (branch (leaf,leaf)) = (0,0) bprint (branch (leaf, branch (leaf,leaf))) = (0, (0, 0)) 等等 问题是这个函数总是返回不

我试图将一个通用的二叉树表示为一对

我将使用SML语法作为示例。这是我的btree类型定义:

datatype btree = leaf | branch of btree*btree;
因此,我想编写一个函数,给定一个btree,打印以下内容:

bprint leaf = 0
bprint (branch (leaf,leaf)) = (0,0)
bprint (branch (leaf, branch (leaf,leaf))) = (0, (0, 0))
等等

问题是这个函数总是返回不同的类型。这显然是SML的问题,也可能是其他函数式语言的问题


有什么想法吗?

因为您只需要将树形结构打印到屏幕上,您只需这样做,并将函数的返回类型设置为
单元
。这不是试图返回元组
(0,(0,0))
而是将字符串(0,(0,0))打印到屏幕上。这样,您就不会在类型方面遇到任何困难。

如果您真的不需要其他任何地方的字符串表示,正如其他人所提到的,只打印树可能是最简单的方法:

open TextIO

datatype btree = leaf | branch of btree * btree

fun print_btree leaf = print "0"
  | print_btree (branch (s, t)) =
    (print "("; print_btree s; print ", "; print_btree t; print ")")
如果您还希望能够获取表示
btree
的字符串,那么简单的解决方案是:

fun btree_to_string leaf = "0"
  | btree_to_string (branch (s, t)) =
    "(" ^ btree_to_string s ^ ", " ^ btree_to_string t ^ ")"
但是,我并不真正推荐这种变体,因为对于big
btree
s,由于有许多字符串串联,因此存在一个问题

值得考虑的是以下变体,它通过一个技巧(例如,Haskell的
Show
类中也使用了这个技巧)避免了连接问题,即,不处理字符串,而是处理从字符列表到字符列表的函数。然后,可以用函数组合代替串联

fun btree_to_string' t =
  let
    fun add s t = s @ t
    fun add_btree leaf = add [#"0"]
      | add_btree (branch (s, t)) =
        add [#"("] o add_btree s o add [#",", #" "] o add_btree t o add [#")"]
  in implode (add_btree t []) end

我不确定你的要求是什么。为什么函数需要返回元组?是否需要将结果用作元组?让它返回字符串会有问题吗?@sepp2k不,我没有要求。我只想打印一个btrees的图形表示。使用元组是我唯一想到的事情。如果您有其他视图,请共享!如果你想在其他地方使用函数的结果,除了把它们打印到屏幕上,使用字符串也可以。如果没有,也可以让函数打印树。这就是它的名字所暗示的。@sepp2k不,重新使用函数的结果不是强制性的。