1

我想用 SML 生成一个上下文无关语法样式的整数列表。

语法类似于S -> 1 S 2 | epsilon.

这就是我尝试过的

fun gen(n: int) = 
    if n = 0 then []
    else 1 :: gen(n - 1) :: 2

例如的预期结果gen(3)应该是[1, 1, 1, 2, 2, 2]

但是,我收到了与类型有关的错误。

Error: operator and operand don't agree [literal]
  operator domain: 'Z * 'Z list
  operand:         'Z * int
  in expression:
    gen (n - 1) :: 2

那么我应该如何实现呢?在此先感谢您的帮助,我们将不胜感激!

4

2 回答 2

2

或者,使用模式匹配:

fun gen 0 = []
  | gen n = 1 :: gen (n-1) @ [2]
于 2013-10-17T11:36:52.153 回答
1

我明白了,我应该做

fun gen(n: int) = 
    if n = 0 then []
    else 1 :: gen(n - 1) @ [2]
于 2013-10-16T04:54:57.853 回答