Что такое Фреге, эквивалентный функции "взаимодействия" Хаскелла?

Я пытаюсь получить пример подсчета слов из реального Haskell, работающего во Фреге:

main _ = interact wordCount
    where wordCount input = show (length (lines input)) ++ "\n"

но я получаю

can't resolve `interact`

Есть ли у Фреге идиоматический способ сделать это?

1 ответ

Решение

Это не в стандартной библиотеке, но вы можете определить что-то вроде этого:

import Data.List(intercalate)

interact :: (String -> String) -> IO ()
interact f = stdin.getLines >>= println . f . intercalate "\n"

Обновление (для комментария на Groovy's eachLine):

Фреге имеет try, catch, finally а также BufferedReader.getLine что мы можем использовать для создания такой функции:

eachLine :: Reader -> (String -> IO ()) -> IO ()
eachLine reader f = BufferedReader.new reader >>= go where
  go breader = forever (breader.getLine >>= f)
    `catch` (\(e :: EOFException) -> return ())
    `finally` breader.close

try, catch а также finally являются функциями следующих типов:

try :: (Applicative γ,Bind γ) => (α->γ β) -> α -> γ β
catch :: Exceptional β => ST γ α -> (β->ST γ α) -> ST γ α
finally :: IO α -> IO β -> IO α

И мы можем просто использовать catch а также finally без try как мы сделали в eachLine выше. Пожалуйста, смотрите эту заметку из источника Фреге о том, когда try является необходимым.

Другие вопросы по тегам