Haskell:从文件读取到变量
我在Haskell中有以下代码:Haskell:从文件读取到变量,haskell,Haskell,我在Haskell中有以下代码: import System.IO data Plaster = Plaster [String] deriving (Read, Show) main = do putStrLn "Please choose path:" path <- getLine openn <- openFile path ReadMode plaster1 <- hGetLine openn
import System.IO
data Plaster = Plaster [String] deriving (Read, Show)
main = do putStrLn "Please choose path:"
path <- getLine
openn <- openFile path ReadMode
plaster1 <- hGetLine openn
let plaster2 = read plaster1::Plaster
putStrLn(plaster1)
getFirst :: Plaster -> String
getFirst (Plaster (x:xs)) = x
getFirst (Plaster []) = []
import System.IO
数据石膏=石膏[String]派生(读取、显示)
main=do putStrLn“请选择路径:”
路径在OP中,main
定义了一个函数,其类型为IO()
。这基本上意味着两件事:
IO
通知我们函数不纯净
()
告诉我们它不返回任何数据
main
中定义的所有命名值仅在该函数中可用。我们说它们的作用域是main
函数。它们在功能之外是不可访问的。这不仅适用于plaster2
,而且同样适用于path
、openn
和plaster1
虽然您可以更改main
,使其返回一个值,但这将是非正统的;main
函数很特殊,因为这通常是应用程序的入口点
相反,我建议您将您关心的行为提取到一个单独的(不纯)函数中:
readFirstLineInFile :: IO Plaster
readFirstLineInFile = do
putStrLn "Please choose path:"
path <- getLine
h <- openFile path ReadMode
plaster1 <- hGetLine h
hClose h
return $ read plaster1
*Answer> plaster2 <- readFirstLineInFile
Please choose path:
ploeh.txt
*Answer> getFirst plaster2
"foo"
在这里,我启动了readFirstLineInFile
,同时将其返回值绑定到plaster2
。完成交互并键入ploeh.txt
后,readfirstlineinfle
函数返回,并且plaster2
有一个值
现在,我可以使用plaster2
调用getFirst
,并验证结果是否符合预期
但是,如果您的总体目标是能够以交互方式测试getFirst
,则无需将其变得如此复杂;只需使用各种值在GHCI中调用它:
*Answer> getFirst $ Plaster ["foo", "bar"]
"foo"
*Answer> getFirst $ Plaster ["foo"]
"foo"
*Answer> getFirst $ Plaster []
""
这会容易得多,但我不确定这是否是您的总体目标…如本文所述,代码不会编译,尽管OP中没有报告错误消息。请重新发布代码,确保格式正确,因为Haskell使用了大量空白。@MarkSeemann感谢您提到这一点。现在它应该可以正确编译了。事实上,它现在可以编译了。然而,这也意味着它不会产生报告的编译器错误。我不是说,它会产生编译错误。我的意思是,在编译之后,当我想在WinGhci
中键入getFirst plaster2
时,我会收到变量不在范围内:plaster2
@Czarek,这是因为plaster2
是main
的局部变量。在它之外的任何地方都看不到它。