2011-11-04 26 views
5

Tengo el siguiente código:SML - variable sin asignar o constructor

datatype expr = K of string| Number2 of expr * (expr list); 
datatype number = Number1 of string | Number3 of int; 
fun append (nil, l2) = l2 
    | append (x::xs, l2) = x::append(xs, l2); 
fun map [] = [] 
    | map (h::t) = (What h)::(map t); 
fun What (K x) = [Number1(x)] 
    |What (Number2 (t,[])) = Number3(0)::What(t) 
    |What (Number2 (y,a::b)) = append(What(a), map(b)); 

No reconoce la función de "qué" (variable no unido o constructor).. ¿Cómo puedo solucionarlo, que sabrá la función "Qué"?

Gracias.

Respuesta

7

Las declaraciones en SML funcionan de arriba a abajo, por lo que map no ve What. Cambiar el orden no ayudará, ya que entonces What no vería map, dando el mismo error. En su lugar, es necesario declarar las funciones mutuamente recursivas de manera simultánea utilizando and:

fun map [] = [] 
    | map (h::t) = (What h)::(map t) 
and What (K x) = [Number1(x)] 
    | What (Number2 (t,[])) = Number3(0)::What(t) 
    | What (Number2 (y,a::b)) = append(What(a), map(b)) 
3

Usted tiene que usar and de recursión mutua. Aunque tienes otros problemas en tu código. What es claramente un expr -> number list, lo que significa map debe ser expr list -> (number list) list, por lo que en su línea final está tratando de agregar un number list list a un number list. Sin embargo, no está nada claro lo que el código debe hacer, por lo que es posible que tengas que resolver tu propia lógica por tu cuenta. No parece haber una forma obvia de escribir una función con el tipo requerido.

+0

Gracias, Nicholas, yo solo trato con esto y apilo. "b" puede ser una lista de expr. Solo quiero verificar cada expr en esa lista y decidir si es "Number1" o "Number3" o expr de tipo de datos; todo esto lo hago con la función What. La única idea es usar "mapa" para verificar cada miembro de la lista. Pero da un error: "operador y operador no están de acuerdo". ¿Alguna idea? –

+2

Tus tipos están muy confundidos. En primer lugar, sí: b es definitivamente una lista de expr. Todos son exprs: no Number1 o Number3s en b. Deberá explicarnos lo que está tratando de hacer, porque no creo que tengamos la oportunidad de ayudarlo de otra manera. ¿Te das cuenta de que la función del mapa es muy diferente al mapa normal? Quizás esa es la confusión. Ignoras y también; ¿ese expr está destinado a ser usado para algo? –

+1

¿Por qué mi función es diferente del mapa normal? Aclararé mi pregunta: El número 2 es expr, y puede ser una lista de expr. Ahora, si es una lista de expr, entonces quiero verificar cada miembro en esa lista, y averiguar si es K o Number2. Luego, tengo que decidir qué hacer con este miembro (puede ser Number1 o Number3, mis dos primeras líneas en la función What) y hacer una lista que solo contenga Number1 o Number3. entonces, Mi forma intuitiva es usar un mapa para verificar cada miembro en "b", iniciar el final de la lista, usando la función de mapa. Gracias. –

Cuestiones relacionadas