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

我在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
          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
的局部变量。在它之外的任何地方都看不到它。