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)