字符“1”中没有Num字符串的实例

时间:2013-11-12 11:39:39

标签: haskell

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“]运行时,它运行良好。我没有指定类型,但它不适用于整数。

3 个答案:

答案 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]