什么是弗雷格相当于Haskell的“交互”功能?

时间:2013-09-12 08:32:34

标签: frege

我试图从现实世界的Haskell中获取字数统计示例:在Frege中运行:

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

但我得到

can't resolve `interact`

有一种弗雷格惯用法吗?

1 个答案:

答案 0 :(得分:3)

它不在标准库中,但您可以定义如下内容:

import Data.List(intercalate)

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

更新(关于Groovy eachLine的评论):

弗雷格有trycatchfinallyBufferedReader.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

trycatchfinally是具有以下类型的函数:

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

我们可以使用catchfinally而不是try,就像我们在eachLine上面所做的那样。如果需要try,请参阅Frege来源的note