1

このデータ型を操作する Little Mler の関数を翻訳しています

type sexp<'T> = 
    An_Atom of 'T
    | A_slist of slist<'T>
and 
    slist<'T> = 
    Empty
    | Scons of sexp<'T> * slist<'T>

関数

// occurs_in_slist : aVal slist -> int
// checks the number of occurrence for aVal in slist

let rec occurs_in_slist =
    function
    _, Empty-> 0
   | (aVal : 'T), Scons(aSexp, (aSlist : 'T)) -> 
    occurs_in_sexp (aVal, aSexp) + occurs_in_slist (aVal, aSlist)
and
   aVal, An_Atom (bVal) ->  if (aVal = bVal) then 1 else 0
   |  (aVal , A_slist(aSlist)) -> occurs_in_slist (aval, aSlist)

ただし、2番目の関数でこのエラーが発生します

error FS0010: Unexpected symbol '->' in binding. Expected '=' or other token.
4

1 に答える 1

5

関数定義では、andキーワードを使用して相互に再帰的な一連の関数を定義しましたが、最初の関数の名前のみを指定しました。の後に他の関数の名前を期待してandいるため、エラーが発生しています。残念ながら、あなたはそれを省略しました。

これがあなたがやろうとしていたことだと思います:

let rec occurs_in_slist = function
  | _        , Empty -> 0
  | aVal : 'T, Scons(aSexp, aSlist : slist<'T>) -> 
        occurs_in_sexp (aVal, aSexp) + occurs_in_slist (aVal, aSlist)
and occurs_in_sexp = function
  | aVal : 'T, An_Atom(bVal) -> if (aVal = bVal) then 1 else 0
  | aVal     , A_slist(aSlist) -> occurs_in_slist (aVal, aSlist)

ここでのより適切な戻り値の型は a であるべきだと思いますがbool

let rec occurs_in_slist = function
  | _        , Empty -> false
  | aVal : 'T, Scons(aSexp, aSlist : slist<'T>) -> 
        occurs_in_sexp (aVal, aSexp) || occurs_in_slist (aVal, aSlist)
and occurs_in_sexp = function
  | aVal : 'T, An_Atom(bVal) -> aVal = bVal
  | aVal     , A_slist(aSlist) -> occurs_in_slist (aVal, aSlist)
于 2011-09-18T16:37:35.717 に答える