main = do
putStrLn $myLast [1,2,3,4]
myLast :: [a] -> a
myLast [x] = x
myLast (_:xs) = myLast xs
当我尝试运行此代码时,我收到此消息:
“文字”1“中没有(Num String)的实例 可能的解决方法:为(Num String)“
添加实例声明当我使用列表[“1”,“2”,“3,”4“]运行时,它运行良好。我没有指定类型,但它不适用于整数。
答案 0 :(得分:12)
“没有...的实例”错误消息通常会产生误导。
你遇到的问题只是这个
前奏> :t putStrLn
putStrLn :: String - > IO()
即。该函数只能处理字符串,而不能处理数字。一个经常看到的解决方案是首先将您要显示的内容翻译成字符串:putStrLn (show x)
,但实际上该组合作为更好的标准函数存在:
main = do
print $ myLast [1,2,3,4]
答案 1 :(得分:5)
编译器从
结束putStrLn x
x
必须是String
。
myLast [1,2,3,4]
是Num a => a
,当您现在用a
替换String
时,
Num String => String
这是完全合乎逻辑的,除了类型检查器记住Num
约束来自文字1
。
因此,您获得的消息只是说数字不是字符串的另一种方式,而putStrLn非常想要一个字符串。或者,如果您愿意,表达式将被很好地键入,如果只有字符串是数字。
答案 2 :(得分:1)
putStrLn
的类型为String -> IO ()
,因此您需要先将列表元素转换为字符串。
您可以使用show
:
putStrLn $ show $ myLast [1,2,3,4]