【问题标题】:No instance for Num String arising from the literal `1'没有由文字 '1' 产生的 Num String 实例
【发布时间】:2013-11-12 11:39:39
【问题描述】:
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"] 运行时,它运行良好。我没有指定类型,但它不适用于 ints。

【问题讨论】:

  • 这只是另一种说法,数字不是字符串,而 putStrLn 非常想要一个字符串。

标签: haskell


【解决方案1】:

“No instance for...”错误消息通常具有误导性。

你的问题就是这个

前奏曲> :t putStrLn
putStrLn :: 字符串 -> IO ()

即该函数只能处理字符串,不能处理数字。一个常见的解决方案是首先将您想要显示的内容翻译成字符串:putStrLn (show x),但实际上该组合作为一个更好的标准函数存在:

main = do  
    print $ myLast [1,2,3,4]

【讨论】:

    【解决方案2】:

    编译器从

    putStrLn x
    

    x 必须是 String

    的推断类型
    myLast [1,2,3,4]
    

    Num a => a,当您现在将a 替换为String 时,您会得到

    Num String => String
    

    这一切都很合乎逻辑,除了类型检查器记得Num 约束源自文字1

    因此,您收到的消息只是表示数字不是字符串的另一种方式,而 putStrLn 非常想要一个字符串。或者,如果您愿意,如果只有字符串是数字,则表达式的类型会很好。

    【讨论】:

      【解决方案3】:

      putStrLn 的类型为String -> IO (),因此您需要先将列表元素转换为字符串。

      您可以使用show

      putStrLn $ show $ myLast [1,2,3,4]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-07-26
        • 1970-01-01
        • 2019-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多