我尝试从在 Frege 运行的真实 Haskell 中获取字数统计示例:
main _ = interact wordCount
where wordCount input = show (length (lines input)) ++ "\n"
但我明白了
can't resolve `interact`
有没有一种弗雷格惯用的方法来做到这一点?
我尝试从在 Frege 运行的真实 Haskell 中获取字数统计示例:
main _ = interact wordCount
where wordCount input = show (length (lines input)) ++ "\n"
但我明白了
can't resolve `interact`
有没有一种弗雷格惯用的方法来做到这一点?
它不在标准库中,但您可以定义如下内容:
import Data.List(intercalate)
interact :: (String -> String) -> IO ()
interact f = stdin.getLines >>= println . f . intercalate "\n"
更新(关于 Groovy 的评论eachLine
):
Frege 有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
不使用。请参阅Frege 来源的此说明,了解何时需要。try
eachLine
try