如何在多行字符串上与 Haskell 交互?
How does interact work with Haskell on a multiline string?
我正在尝试使用 Haskell 练习声明式编程,但我 运行 对交互功能有些困惑。
我可以从它的类型签名看出它一次对整个字符串进行操作:
interact :: (String -> String) -> IO ()
多行输入的字符串值是多少?我假设它是一个带有换行符的字符串?
对于 Haskell 程序 Main.hs
module Main where
main :: IO ()
main = interact( ... )
和一个输入文件input.txt
5 6 7
3 6 10
如果我运行这样编译的程序:
$ Main < input.txt
交互正在处理的字符串是否为:
5 6 7\n3 6 10
它会将 "5 6 7\n3 6 10\n"
作为字符串传递。我们可以通过使用 show
as function:
轻松验证
main = interact <b>show</b>
如果我们随后使用 I/O 重定向调用程序,我们将得到:
./Main < data.dat
"5 6 7\n3 6 10\n"
您可以使用 lines :: String -> [String]
将 String
转换为 String
的列表,其中每个字符串是一行。如果我们把程序改成:
main = interact (show . <b>lines</b>)
我们看到:
./Main < data.dat
["5 6 7","3 6 10"]
因此,在这种情况下,通过使用 lines
,我们检索了包含两个元素 "5 6 7"
和 "3 6 9"
.
的列表
我正在尝试使用 Haskell 练习声明式编程,但我 运行 对交互功能有些困惑。
我可以从它的类型签名看出它一次对整个字符串进行操作:
interact :: (String -> String) -> IO ()
多行输入的字符串值是多少?我假设它是一个带有换行符的字符串?
对于 Haskell 程序 Main.hs
module Main where
main :: IO ()
main = interact( ... )
和一个输入文件input.txt
5 6 7
3 6 10
如果我运行这样编译的程序:
$ Main < input.txt
交互正在处理的字符串是否为:
5 6 7\n3 6 10
它会将 "5 6 7\n3 6 10\n"
作为字符串传递。我们可以通过使用 show
as function:
main = interact <b>show</b>
如果我们随后使用 I/O 重定向调用程序,我们将得到:
./Main < data.dat
"5 6 7\n3 6 10\n"
您可以使用 lines :: String -> [String]
将 String
转换为 String
的列表,其中每个字符串是一行。如果我们把程序改成:
main = interact (show . <b>lines</b>)
我们看到:
./Main < data.dat
["5 6 7","3 6 10"]
因此,在这种情况下,通过使用 lines
,我们检索了包含两个元素 "5 6 7"
和 "3 6 9"
.