Haskell - liczby zespolone i problem z Kompilacją.

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 ++ ")" )

0

Hmm, napisałeś...?

  1. Co to za do::?
         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ć...

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.

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.hs13: 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):

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 ++ ")" )
0

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

1 użytkowników online, w tym zalogowanych: 0, gości: 1