LINUX.ORG.RU

haskell - не дайте разочароваться


0

0

господа, разъясните либо ткните в пример, да посильнее... в общем, берём простую ситуацию: получаем данные из внешнего мира, упакованные в конечном итоге в IO [Char]. вопрос: как мне этот неблагодарный тип трансфпрмировать в просто [Char], чтоб позже спользовать чистый функциональный аппарат без всяких do? >>= aka bind - не годится, т.к. он только может "отложить" IO: действия "внутри него" происходят с "чистыми" данными, но вконце концов бирка IO к типу будет прицеплена. Ужас, что же делать? Неужели никак?

★★★★★
Ответ на: комментарий от grob

import IO

foo = do hSetBuffering stdin LineBuffering putStrLn "write something" getLine

*Main> :t foo foo :: IO String *Main> bar <- foo write something hello *Main> bar "hello" *Main> :t bar bar :: String

Или я что-то не понял? Можешь кусок кода привести?

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

Тьфу

import IO

foo = do 
     hSetBuffering stdin LineBuffering 
     putStrLn "write something" 
     getLine

*Main> :t foo 
foo :: IO String 
*Main> bar <- foo 
write something 
hello 
*Main> bar 
"hello" 
*Main> :t bar 
bar :: String 

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

так-то оно так...

ну вот скажем:
-----------------
module Main
where

import IO

reader = do 
     hSetBuffering stdin LineBuffering 
     putStrLn "write something" 
     getChar

main = do
	smth <- reader	
	putStrLn $show $engine smth

engine :: Char -> Int 
engine 'a' = 0
engine _   = 1

-----------------

но как воспользоваться ентим '<-' не в императивной функции - без do?

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

а вообще-то до меня по капельке начинает доходить... если оно откуда-то вошло, то оно определённо должно выйти, а всё логику можно впихнуть в чисто функциональный engine...

чё-то я уже и сам не оч. понимаю, чего хочу - иду сапть :)

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

>но как воспользоваться ентим '<-' не в императивной функции - без do

Ну, если уж очень хочеться - есть unsafePerformIO. Но, вследствие ленивости, оно будет выполняться неизвестно когда, что может тебе не понравиться. Т.ч. лучше оставить IO-у - IO-ово, и пользоваться не (<-)ой а её результатом.

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

Вот только не надо без необходимости пользоваться unsafePerformIO

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

По-хорошему (без unsafePerformIO) из монады IO вырваться нельзя, да и
_не нужно_ в твоем случае.

procIO = do datum <- receive
            let result = process datum
            send result
datum   :: Datum
receive :: IO Datum
process :: Datum -> Result
send    :: Result -> IO ()

Всю обработку здесь выполняет pure-код.

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

> но как воспользоваться ентим '<-' не в императивной функции - без do?

А не надо им там пользоваться, pure-функция получит это значение в качестве параметра. Pi, не забывай - результат pure-функции зависит только от ее параметров, т.е. никакого ввода/вывода там быть не может (ну кроме trace).

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

spasibo! ty ulovil sut' moih esteticheskih muchenij :) sionia po doroge na rabotu dumyslil ih primerno do takih ze rezul'tatov.

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

> (ну кроме trace).

Который реализован с помощью unsafePerformIO :)

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