【问题标题】:Haskell - Instance of Num Char required for definition of a functionHaskell - 定义函数所需的 Num Char 实例
【发布时间】:2018-10-30 20:29:44
【问题描述】:

我想用 3 个输入参数和 1 个输出参数编写一个简单的递归函数:

getLengthOfNumber :: (String, Int, Int) -> Int
getLengthOfNumber (n, i, res)
    | isCharDigit(n!!i+1) = getLengthOfNumber (n, i+1, res+1)
    | otherwise = res

为什么 Hugs 会向我抛出错误“定义 getLengthOfNumber 所需的 Num Char 实例”?

【问题讨论】:

    标签: haskell


    【解决方案1】:

    !!+ 具有更高的优先级,因此n!!i+1 被解析为(n !! i) + 1,它会尝试将一个添加到字符串的元素中,这仅在Char 是数字时才有效。你应该改写n !! (i+1)

    【讨论】:

      【解决方案2】:

      因为它解释:

      n!!i+1
      

      作为:

      (n!!i) + 1
      

      因此它首先获取字符串的i-th 字符,然后将1 添加到它。现在在 Haskell 中可以定义一个自定义数字类型。所以在这里你可以将该字符和1 加在一起,但前提是该字符是一个数字。

      但话虽如此,即使固定支架,上述方法也不起作用。您没有指示何时停止迭代:对于字符串"123",它最终会获取最后一个字符,然后在到达字符串末尾时引发“索引太大”错误。此外,!! 效率不是:它需要 O(k) 来访问第 k 个元素,这使得该算法成为二次算法。

      这里可以使用takeWhile :: (a -> Bool) -> [a] -> [a]length :: [a] -> Int:先取字符的最长前缀,再取该列表的长度,如:

      getLengthOfNumber :: String -> Int
      getLengthOfNumber = length . takeWhile isCharDigit
      

      【讨论】:

      • 谢谢! n!!(i+1) 解决了我的问题。除此之外,该功能就像我需要的那样工作。
      • @GeorgNatter:如果你输入"123"会怎样?
      猜你喜欢
      • 1970-01-01
      • 2013-12-25
      • 1970-01-01
      • 1970-01-01
      • 2019-07-26
      • 1970-01-01
      • 1970-01-01
      • 2012-01-22
      • 2021-04-28
      相关资源
      最近更新 更多