我试图从现实世界的Haskell中获取字数统计示例:在Frege中运行:
main _ = interact wordCount
where wordCount input = show (length (lines input)) ++ "\n"
但我得到
can't resolve `interact`
有一种弗雷格惯用法吗?
答案 0 :(得分:3)
它不在标准库中,但您可以定义如下内容:
import Data.List(intercalate)
interact :: (String -> String) -> IO ()
interact f = stdin.getLines >>= println . f . intercalate "\n"
更新(关于Groovy 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
,请参阅Frege来源的note。