2014-09-03 7 views
6

Właśnie zaczynam uczyć się programowania funkcjonalnego, mój wybór to haskell. To było ok przez kilka dni, aż coś bizzare zdarzyć w konsoliHaskell wypluwa złe liczby losowo

Na początku myślałem, samouczek (http://learnyouahaskell.com/starting-out) jest źle

Prelude> [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2] 
[(1,1,1)] 

Należy (3,4,5) i (4,6,8). Próbowałem 3^2+5^2, wypluwa to mnóstwo liczb (coś w rodzaju 60 wierszy liczb, około 3000 cyfr); 4^2+3^2 wydaje się wytwarzać te same liczby.

Próbując dodać dowolne numery wynik będzie 100

Prelude> 100 + 200 
100 
Prelude> 300 + 500 
100 

zamknę okno i ponownie otworzyć go i problem został rozwiązany.

Czy to błędne obliczenie często miało miejsce w Haskell? a może moja wersja Haskella jest uszkodzona podczas pobierania? lub Jest szansa, że ​​to rzadki błąd?

+6

Czy jesteś pewien, że nie zrobił czegoś podobnego niech ' + b = 100' przed uruchomieniem tej linii? Nie mogę replikować twoich wyników, a definicje "let" w ghci są trochę stanowe. – BluePeppers

+0

Również poprawne wyjście powinno być prawdopodobnie "[(3,4,5), (6,8,10)]", co jest tym, co otrzymuję (i odpowiada zarówno stronie Wikipedii, jak i mojej edukacji matematycznej jako pierwsze 2 Trójki pitagorejskie) – BluePeppers

+0

@BluePeppers Myślę, że go masz, ponieważ po 'let a + b = 100', to zrozumienie listy * nie * daje' [(1,1,1)] '. –

Odpowiedz

11

To, co się dzieje, jak sugeruje @BluePeppers, polega na tym, że w jakiś sposób zrobiłeś odpowiednik let a+b = 100 w ghci, po czym używa tej definicji zamiast zwykłej + we wszystkich twoich wyrażeń.

Możecie nadal zastanawiam się, dlaczego to daje takie ogromne liczby, a więc ja aż zdałem sobie sprawę, drugi punkt: Redefiniowanie (+) też redefiniuje swoją pierwszeństwo, do domyślnego 9 (najwyższy). Więc twoje przykłady zostać zinterpretowane jako:

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2] 

staje

[ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^100^2 == c^2] 

i

3^2+5^2 

staje

3^100^2 
+0

Och, to nawet lepsze niż się spodziewałem. Jak cudownie – BluePeppers

+0

aah, nie wiedziałem, że haskell może przesłonić operatora. – Rmxhaha

+0

Myślałem, że haskell może rozwiązać problem aljebry, a następnie spróbowałem tego przed wypróbowaniem samouczka, – Rmxhaha