Я пытался использовать библиотеку Conduit для создания простых файлов ввода-вывода, но мне тяжело.Haskell Conduit: наличие раковины возвращает значение, основанное на значениях от восходящего потока
У меня есть текстовый файл, содержащий только несколько цифр, таких как 1234
. У меня есть функция, которая читает файл, используя readFile
(без каналов), и возвращает Maybe Int
(Nothing
возвращается, когда файл на самом деле не существует). Я пытаюсь написать версию этой функции, которая использует кабели, и я просто не могу понять это.
Вот что у меня есть:
import Control.Monad.Trans.Resource
import Data.Conduit
import Data.Functor
import System.Directory
import qualified Data.ByteString.Char8 as B
import qualified Data.Conduit.Binary as CB
import qualified Data.Conduit.Text as CT
import qualified Data.Text as T
myFile :: FilePath
myFile = "numberFile"
withoutConduit :: IO (Maybe Int)
withoutConduit = do
doesExist <- doesFileExist myFile
if doesExist
then Just . read <$> readFile myFile
else return Nothing
withConduit :: IO (Maybe Int)
withConduit = do
doesExist <- doesFileExist myFile
if doesExist
then runResourceT $ source $$ conduit =$ sink
else return Nothing
where
source :: Source (ResourceT IO) B.ByteString
source = CB.sourceFile myFile
conduit :: Conduit B.ByteString (ResourceT IO) T.Text
conduit = CT.decodeUtf8
sink :: Sink T.Text (ResourceT IO) (Maybe Int)
sink = awaitForever $ \txt -> let num = read . T.unpack $ txt :: Int
in -- I don't know what to do here...
Может кто-то пожалуйста, помогите мне завершить функцию sink
? Спасибо!
Привет! Спасибо за ваш ответ! Действительно, до сих пор я пытался использовать Conduit для операций, которые неизбежно требуют, чтобы все данные были в памяти сразу, поэтому я, вероятно, не применяю библиотеку к ситуациям, которые она должна была обрабатывать сама по себе. Спасибо за предоставление образца кода. –
Нет проблем с этим в целях обучения, на самом деле это хороший подход. Я просто хотел пояснить, что это не отличный пример соотношения мощности и веса кабелепровода. –