LINUX.ORG.RU

Haskell: ошибка использования ф-ции


0

0

Хочу заюзать ф-цию encode из модуля Data.Binary:
----------------------------------------
import Data.Binary

main = do s1 <- encode (2 :: Integer)
          print s1
----------------------------------------

encode :: Binary a => a -> ByteString
Экземпляр Binary Integer есть.

 $ ghc --make Test.hs -o test
[1 of 1] Compiling Main             ( Test.hs, Test.o )

Test.hs:3:16:
    Couldn't match expected type `t t1'
           against inferred type `Data.ByteString.Lazy.Internal.ByteString'
    In a 'do' expression: s1 <- encode 'a'
    In the expression:
        do s1 <- encode 'a'
           print s1
    In the definition of `main':
        main = do s1 <- encode 'a'
                  print s1

Подрубаю модуль
import Data.ByteString.Lazy.Internal (ByteString)

Ошибка:
Test.hs:3:16:
    Couldn't match expected type `t t1'
           against inferred type `ByteString'
....... далее тож самое

Почему не хочет работать ?

Потому что encode - чистая функция. do-синтаксис требует, чтобы справа от "<-" стояло значение внутри текущей монады. А encode (2::integer) имеет тип ByteString, вне каких-либо монад. Тебе нужно

do {let s1 = encode (2 :: Integer); print s1}

или просто

print (encode (2 ::Integer))

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

А почему тогда не работает ?:

main = do s1 <- getWord8
          print s1

Ведь у getWord8 тип Get Word8, т.е. монадически (монада GET).
По идее так же, как и 
getChar :: IO Char (монада IO).

brahman
() автор топика
Ответ на: комментарий от brahman

Потому что гладиолус. Блин, ну сам подумай, getWord8 - в монаде Get, а print - в монаде IO. С чего оно должно работать, а?

Miguel ★★★★★
()
Ответ на: комментарий от brahman

Тут ты вообще всё смешал. put - в монаде PutM, get - в монаде Get, а print - в монаде IO. Ну как, каким местом это должно работать?

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

Это я по примеру (instance Binary Main.Drinks where). Там, кстати,
примера использования нет.
Нуу, хорошо, а можно простейший пример использования put и get:
Например, запись Integer в монаду PutM, вычитать это значение и
визуально проконтролировать (типа print). 
Спасибо.

brahman
() автор топика
Ответ на: комментарий от brahman

P.S.Т.е., если монада IO ассоциируется или со стандартным std in/out, либо с дескрипторами файлов, то как реализуется запись/чтение для монад PUT и GET ?

brahman
() автор топика
Ответ на: комментарий от Miguel

Так я и прошу: покажи как практически использовать монаду PUT,GET. Вот как про encode растусовал - всё понятно стало. Спасибо. Но это ф-ция не монадическая - это проще.

brahman
() автор топика
Ответ на: комментарий от brahman

> Char :: Char -> IO ()

> getChar :: IO Char

Что ты хочешь сказать?

Miguel ★★★★★
()
Ответ на: комментарий от Miguel

data Exp = IntE Int
          | OpE  String Exp Exp
    deriving Show

instance Binary Exp where
       put (IntE i)          = do put (0 :: Word8)
                                  put i
       put (OpE s e1 e2)     = do put (1 :: Word8)
                                  put s
                                  put e1
                                  put e2
 
       get = do t <- get :: Get Word8
                case t of
                     0 -> do i <- get
                             return (IntE i)
                     1 -> do s  <- get
                             e1 <- get
                             e2 <- get
                             return (OpE s e1 e2)

Это понятно. Но как сейчас применить эти методы (put и get) ?

brahman
() автор топика
Ответ на: комментарий от brahman

Но лучше простой примерчик использования методов put & get для, например, Instance Binary Integer. Просто как практически использовать монаду IO - всё понятно, а вот другие - не совсем.

brahman
() автор топика
Ответ на: комментарий от brahman

Что значит "сейчас"? Задача - как стоит?

Miguel ★★★★★
()
Ответ на: комментарий от brahman

Скажи, в каком формате сохранять Integer, и я тебе покажу этот пример.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.