Haskell 什么';下面的程序怎么了?
这个代码怎么了Haskell 什么';下面的程序怎么了?,haskell,Haskell,这个代码怎么了 module Main where import System.Environment main :: IO () main = do args <- getArgs putStrLn ("Hello, " ++ args !! 0 ++ ", " ++ args !! 1) putStrLn(add (read args !! 0) (read args !! 1)) add x y = x + y modulemain其中 导入系统。环境 ma
module Main where
import System.Environment
main :: IO ()
main = do
args <- getArgs
putStrLn ("Hello, " ++ args !! 0 ++ ", " ++ args !! 1)
putStrLn(add (read args !! 0) (read args !! 1))
add x y = x + y
modulemain其中
导入系统。环境
main::IO()
main=do
args读取args!!0应读取(args!!0)
并且添加xy=x+
应添加xy=x+y
。另外,putStrLn
只接受一个字符串,因此使用也打印数字的print
然而,看到你是哈斯克尔的新手。我重写了你程序的一部分,以展示一种更haskellish的方式
main = do
(arg0:arg1:restArgs) <- getArgs
putStrLn $ "Hello, " ++ arg0 ++ ", " ++ arg1
print $ add (read arg0) (read arg1)
add = (+)
main=do
(arg0:arg1:restArgs)只需对错误消息和给出的解决方案进行一些详细说明。查看第一个错误:
No instance for (Num String)
...
In the first argument of `putStrLn'
没有(Num字符串)的实例
...
在“putStrLn”的第一个参数中
这可能有点不清楚。查看putStrLn的类型签名:
putStrLn :: String -> IO ()
putStrLn::字符串->IO()
因此,putStrLn是一个接受字符串并计算为IO操作的函数。但是,您已经直接尝试向putStrLn传递一些表达式,如(x+y),它是一个数字,字符串不是数字(在Haskell术语中,它的类型签名是(Num t)=>t)
上述解决方案建议改用打印功能:
print :: (Show a) => a -> IO ()
打印::(显示a)=>a->IO()
“print”和“putStrLn”的区别在于,print可以获取任何可显示的内容,包括数字
下一步:
Couldn't match expected type `Char' with actual type `[Char]'
Expected type: String
Actual type: [String]
In the first argument of `read', namely `args'
无法将预期类型“Char”与实际类型“[Char]”匹配
所需类型:字符串
实际类型:[字符串]
在'read'的第一个参数中,即'args'
这表示编译器希望将字符串作为第一个要读取的参数,但看到了字符串列表。查看原始代码:
read args !! 0
阅读args!!0
在Haskell中,函数应用程序具有最高优先级,因此编译器基本上是这样读取代码的:
(read args) !! 0
(阅读args)!!0
(请特别注意,read绑定的应用程序高于!!运算符的使用)。希望现在应该很清楚,读取已应用于所有arg
由于您的意图似乎是读取args的第一个元素,因此需要使用如下括号:
read (args !! 0)
读取(args!!0)
希望这能让错误信息更容易理解 嗯,有什么问题吗?错误?您需要从无点版本的add
中删除xy
。回答得好,否则,+1。没错,朋友。编辑了它,很抱歉没有费心编译代码。:)我认为真正的原因是
被认为是不好的做法,因为它具有不需要的错误处理。我还可能指出,虽然在列表中使用模式匹配比使用更简洁代码>,它具有相同的危险错误行为。是。有很多原因代码>是一种不好的做法,我只是想保持简短。对哈斯克尔的研究和思考越多,你就可以得出越开明的结论。至于提问者,我认为只给出一个简短的提示是最合适的,而不是详细说明为什么代码>是不好的做法。关于错误处理,我认为模式匹配会使错误信息更加清晰。
read (args !! 0)