2012-01-01 18 views
9

Poniższe fragmenty kodu są częścią próba na tworzenie funkcji generateUpTo który generuje listę pAllSorted która zależy nmax a zatem Rmax.Haskell - nie wchodzi w zakres

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!" 

Jednak przy próbie kompilacji, kompilator daje "nie" błąd w zakresie około RMAX w (co jest tutaj) Linia 1,3 i 4.

(Jak) mogę pozostaw rmax niezdefiniowana do czasu użycia funkcji generateUpTo?

+7

Dla osoby, która głosuje na pytania początkowe Haskell, byłoby bardzo pomocne, gdybyś mógł wiedzieć, zostaw komentarz, dlaczego to robisz. – Phyx

+1

będziemy go popierać! :) bardziej poważnie, doszło do dużego nadużycia dla osób pytających "zadawaj mi pracę" na temat zadań domowych, może to był błąd. – gatoatigrado

+1

@Phyx Właściwie to staram się nie głosować na pytania dla początkujących, ale może uda mi się wyjaśnić, jak to działa. Wiele z tych pytań dotyczy określenia "zbyt zlokalizowane", a ogólnie nie jest interesujące. –

Odpowiedz

9

Jeśli chcesz użyć rmax wewnątrz nmax, pass i fail bez przekazania go jako arguement, trzeba umieścić go w bloku where z generateUpTo. W przeciwnym razie jest dosłownie "nie w zasięgu". Przykład:

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 

Jeśli chcesz te funkcje mają być używane w wielu miejscach, można po prostu accect rmax jako arguement:

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

Uwaga - Wygląda na to również mają pewne problemy z definicją z check ... wartości i fail są tylko argumenty check, a nie funkcje, które zdefiniowałeś powyżej.

Aktualizacja

używać Nmax (na zewnątrz-the-gdzie-block wersji zakres), trzeba przekazać wartość Rmax do niego. Tak:

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

Uwaga jednak, że nazwa rmax w definicji nmax nie jest już istotne. Funkcje te są dokładnie takie same:

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

Podobnie, nie trzeba nazwać ją z wartością nazwie 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

Jeśli ** pAllsorted ** jest zdefiniowane gdzieś indziej, a ** nmax ** jest używane w tej definicji, czy ** nmax ** nadal będzie w zasięgu, jeśli użyję tej metody, aby rozwiązać problem? –

+0

w moim drugim przykładzie ... tak, to powinno działać poza blokiem 'where'. Żeby to nazwać, musisz przekazać cokolwiek ma wartość rmax. np. "nmax 10" lub "nmax myRmaxVal" –

+0

czy możesz wyjaśnić, w jaki sposób przekazać wartość rmax do niego? –

4

Wystarczy umieścić definicje nmax, pass i fail do klauzuli generateUpTowhere, podobnie jak to było z 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!" 

rmax jest parametrem funkcji jest niezdefiniowana poza funkcją, w którym została zadeklarowana. W tym przykładzie rmax w funkcji nmax jest całkowicie niezwiązane z rmax w generateUpTo.