2

Frege で実行されている実際の Haskell から単語カウントの例を取得しようとしています。

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

しかし、私は得る

can't resolve `interact`

これを行うフレーゲの慣用的な方法はありますか?

4

1 に答える 1

3

標準ライブラリにはありませんが、次のように定義できます。

import Data.List(intercalate)

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

更新(Groovy のコメントについてeachLine):

Frege にはtrycatch、が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

trycatchおよびfinally次のタイプの関数です。

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

そして、上記で行ったようにcatch、 andfinallyなしで使用できます。必要な場合は、Frege ソースからのこのメモを参照してください。tryeachLinetry

于 2013-09-12T14:49:54.013 に答える