2012-01-01 13 views
9

Los fragmentos siguientes de código son parte de un intento de crear una función generateUpTo que genera una lista pAllSorted que depende de nmax y por lo tanto rmax.Haskell - no en su alcance

nmax = rmax `div` 10 

pass = rmax `elem` mot 
fail = rmax `notElem` mot 

generateUpTo rmax = check rmax 
where 
     check pass = pAllSorted 
     check fail = error "insert multiple of 10!" 

Sin embargo, cuando se trata de compilar, el compilador da un error de "No en su alcance" sobre rmax en (lo que está aquí) línea de 1,3 y 4.

(Cómo) puedo dejar rmax undefined hasta que se use la función generateUpTo?

+7

Para la persona que sigue votando preguntas de Haskell para principiantes, sería muy útil si pudieras saber, deja un comentario de por qué estás haciendo esto. – Phyx

+1

¡lo superaremos! :) Más en serio, ha habido mucho abuso por parte de la gente que pregunta "hazme el trabajo por mi", quizás fue un error. – gatoatigrado

+1

@Phyx En realidad, trato de no votar por las preguntas de los novatos, pero tal vez pueda explicarle al votante. Muchas de estas preguntas son para qué es el término "demasiado localizado" y, en términos más generales, no son interesantes. –

Respuesta

9

Si desea utilizar rmax dentro nmax, pass, y fail sin pasar como un argumento, tendrá que incluirlo en el bloque de generateUpTowhere. De lo contrario, es literalmente "no en el alcance". Ejemplo:

generateUpTo rmax = check rmax 
    where 
     check pass = pAllSorted 
     check fail = error "insert multiple of 10!" 
     nmax = rmax `div` 10 
     pass = rmax `elem` mot 
     fail = rmax `notElem` mot 

Si desea que estas funciones para ser utilizadas en múltiples lugares, sólo podría accect rmax como un argumento:

nmax rmax = rmax `div` 10 
pass rmax = rmax `elem` mot 
fail rmax = rmax `notElem` mot 

Nota - parece que también tiene algunos problemas con su definición de check ... el valor pass y fail solo hay argumentos de check, y no las funciones que ha definido anteriormente.

actualización

utilizar nmáx (la versión alcance fuera-del-en-bloque), tendrá que pasar el valor de Rmax a ella. De este modo:

nmax rmax -- function application in Haskell is accomplished with a space, 
      -- not parens, as in some other languages. 

Nótese, sin embargo, el nombre rmax en la definición de nmax ya no es significativa. Estas funciones son todos exactamente lo mismo:

nmax rmax = rmax `div` 10 
nmax a = a `div` 10 
nmax x = x `div` 10 

Del mismo modo, no es necesario llamar con un valor denominado rmax.

nmax rmax 
nmax 10 -- this is the same, assuming rmax is 10 
nmax foo -- this is the same, assuming foo has your 'rmax' value. 
+0

Si ** pAsorted ** está definido en otro lugar, y ** nmax ** se usa en esa definición, ¿** nmax ** aún estará en alcance si utilizo este método para solucionar el problema? –

+0

en mi segundo ejemplo ... sí, eso debería funcionar fuera del bloque 'where'. Sin embargo, para llamarlo necesitarás pasar el valor de rmax. ej .: 'nmax 10' o' nmax myRmaxVal' –

+0

¿Puedes aclarar cómo pasarle el valor de rmax? –

4

sólo hay que poner las definiciones de nmax, pass y fail en el where cláusula de generateUpTo, tal como lo hizo con check.

2
nmax rmax = rmax `div` 10 

pass rmax = rmax `elem` mot 
fail rmax = rmax `notElem` mot 

generateUpTo rmax = check rmax 
where 
    check pass = pAllSorted 
    check fail = error "insert multiple of 10!" 

El rmax es un parámetro de función que no está definida fuera de la función en la que se declara. En este ejemplo, rmax en la función nmax no está relacionado con el rmax en generateUpTo.