Haskell - liczby zespolone i problem z Kompilacją.

Haskell - liczby zespolone i problem z Kompilacją.
K1
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 6 lat
  • Postów:18
0

Witam, tak jak w temacie otóż napisałem program do obliczania liczb zespolonych itd, problem polega na tym że program mi się nie chce skompilować. Podaje Kod programu. Dodam że inne programy które odpalam w interpreterze GHCI działają.
Plik standardowo z rozszerzeniem .hs. a typ błędu przy kompilacji jest taki: parse error on input `"'
[1 of 1] Compiling Main ( zespolone1.hs, interpreted )
Failed, modules loaded: none.

oto kod źrodłowy:

zespolone :: IO ()
zespolone = do::
putStrLn "Podaj pierwsza liczbe zespolona:"
im1 <- getLine
re1 <- getLine
putStrLn "Podaj druga liczbe zespolona:"
im2 <- getLine
re2 <- getLine
putStrLn "Podaj N:"
nn <- getLine
let a = read im1
b = read re1
c = read im2
d = read re2
n = read nn
imsum = a + c
resum = b + d
immin = a - c
remin = b - d
immn = a * c - b * d
remn = a * d + b * c
imdz = (a * c + b * d) / (c * c + d * d)
redz = (b * c - a * d) / (c * c + d * d)
modz1 = sqrt(a * a + b * b)
pot = (modz1^n)
cosim = cos(a/modz1)
sinre = sin(b/modz1)
if c /= 0 && d /= 0 then putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i / ("++ im2 ++ "+" ++ re2 ++ ")i =" ++ "(" ++ show imdz ++ "+" ++ show redz ++ ")i" )
else putStrLn "nie mozna dzielic przez 0"
putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i + ("++ im2 ++ "+" ++ re2 ++ ")i =" ++ "(" ++ show imsum ++ "+" ++ show resum ++ ")i" )
putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i - ("++ im2 ++ "+" ++ re2 ++ ")i =" ++ "(" ++ show immin ++ "+" ++ show remin ++ ")i" )
putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i * ("++ im2 ++ "+" ++ re2 ++ ")i =" ++ "(" ++ show immn ++ "+" ++ show remn ++ ")i" )
putStrLn ("|("++ im1 ++ "+" ++ re1 ++ ")i|=" ++ show modz1)
putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i^" ++ show n ++ "=" ++ "|" ++ show pot ++ "|(" ++ show cosim ++ "+" ++ "i" ++ show sinre ++ ")" )

edytowany 1x, ostatnio: kamils115
msm
Administrator
  • Rejestracja:około 16 lat
  • Ostatnio:5 miesięcy
0

Hmm, napisałeś...?

  1. Co to za do::?
Kopiuj
         im1 <- getLine  
            re1 <- getLine
         putStrLn "Podaj druga liczbe zespolona:" 
  1. To nie C, nie możesz sobie tak po prostu dodać wcięcia (linie mają być równo wcięte)...

Po tym ma prawo się skompilować...

edytowany 2x, ostatnio: msm
K1
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 6 lat
  • Postów:18
0

To wcięcie zrobiło się po wklejeniu tutaj:)

Oryginalnie nie mam żadnych wcięć tego typu.

co do do::; to tak pisaliśmy na zajęciach i to działało.

msm
Administrator
  • Rejestracja:około 16 lat
  • Ostatnio:5 miesięcy
1

co do do::; to tak pisaliśmy na zajęciach i to działało.

[1 of 1] Compiling Main ( aaa.hs, interpreted )

aaa.hs:2:13: Empty 'do' construct
Failed, modules loaded: none.

Ktoś z nas ma dziwną wersję ghci najwyraźniej...

tak pisaliśmy na zajęciach i to działało.

U mnie tak działa (no... tzn nie rzuca błędów składniowych, nie testowałem działania):

Kopiuj
zespolone :: IO ()
zespolone = do
          putStrLn "Podaj pierwsza liczbe zespolona:"
          im1 <- getLine  
          re1 <- getLine
          putStrLn "Podaj druga liczbe zespolona:"
          im2 <- getLine  
          re2 <- getLine
          putStrLn "Podaj N:"
          nn <- getLine    
          let a = read im1
              b = read re1
              c = read im2
              d = read re2
              n = read nn
              imsum = a + c
              resum = b + d
              immin = a - c
              remin = b - d
              immn = a * c - b * d
              remn = a * d + b * c
              imdz = (a * c + b * d) / (c * c + d * d)
              redz = (b * c - a * d) / (c * c + d * d)
              modz1 = sqrt(a * a + b * b)
              pot = (modz1^n)
              cosim = cos(a/modz1)
              sinre = sin(b/modz1)
          if c /= 0 && d /= 0 then putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i / ("++ im2 ++ "+" ++ re2 ++ ")i =" ++ "(" ++ show imdz ++ "+" ++ show redz ++ ")i" )
          else putStrLn "nie mozna dzielic przez 0"
          putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i + ("++ im2 ++ "+" ++ re2 ++ ")i =" ++ "(" ++ show imsum ++ "+" ++ show resum ++ ")i" )
          putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i - ("++ im2 ++ "+" ++ re2 ++ ")i =" ++ "(" ++ show immin ++ "+" ++ show remin ++ ")i" )
          putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i * ("++ im2 ++ "+" ++ re2 ++ ")i =" ++ "(" ++ show immn ++ "+" ++ show remn ++ ")i" )
          putStrLn ("|("++ im1 ++ "+" ++ re1 ++ ")i|=" ++ show modz1)
          putStrLn ("("++ im1 ++ "+" ++ re1 ++ ")i^" ++ show n ++ "=" ++ "|" ++ show pot ++ "|(" ++ show cosim ++ "+" ++ "i" ++ show sinre ++ ")" )
edytowany 2x, ostatnio: msm
K1
nie wiem czemu to u mnie nie działa pod Win 7, ten sam plik odpaliłem na wirtualnej maszynie pod xp i poszło. Dość dziwne:) lecz dziękuję za pomoc wszystkim którzy chętnie chcieli mi pomóc:) Pozdrawiam
hauleth
Moderator
  • Rejestracja:ponad 17 lat
  • Ostatnio:10 dni
0

Moim pytaniem jest czemu nie zdefiniujesz krotki do przechowywania liczb zespolonych i odpowiednich operatorów na niej.


msm
Cóż, ten kod nie siedzi na zbyt wysokim poziomie więc się już nie czepiałem (ściśle to typu danych Complex oraz instancji odpowiednich typeclass do niej)

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.