微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

没有使用句法否定产生NumInt-> Int的实例

如何解决没有使用句法否定产生NumInt-> Int的实例

我编写了以下Haskell代码以返回[[Int]]的主要和次要对角线

getDiagonal' :: [[Int]] -> Int -> (Int -> Int) -> [Int]
getDiagonal' [] _ _ = []
getDiagonal' (x:xs) i fn = i' : getDiagonal' xs (fn i) fn
  where i' = head $ drop i x

getPrimaryDiagonal :: [[Int]] -> [Int]
getPrimaryDiagonal x = getDiagonal' x 0 (+1)

getSecondaryDiagonal :: [[Int]] -> [Int]
getSecondaryDiagonal x = getDiagonal' x ((length x) - 1) (+(-1))

但是,我本以为最后一行可能是以下内容,使用(-)的方式与(+)

getSecondaryDiagonal x = getDiagonal' x ((length x) - 1) (-1)

但是,当我这样做时,这是行不通的

Main.hs:27:59: error:
    • No instance for (Num (Int -> Int))
        arising from a use of syntactic negation
        (maybe you haven't applied a function to enough arguments?)
    • In the third argument of ‘getDiagonal'’,namely ‘(- 1)’
      In the expression: getDiagonal' x ((length x) - 1) (- 1)
      In an equation for ‘getSecondaryDiagonal’:
          getSecondaryDiagonal x = getDiagonal' x ((length x) - 1) (- 1)

为什么(-)会产生该错误

解决方法

(-1)被解释为负数,据我所知,它是对非二进制运算符的唯一例外。 (-1)因此不是一个减去一的函数。

您可以为此使用subtract :: Num a => a -> a -> a

getSecondaryDiagonal x = getDiagonal' x ((length x) - 1) (subtract 1)

或者您可以使用flip :: (a -> b -> c) -> b -> a -> c 来实现subtract

getSecondaryDiagonal x = getDiagonal' x ((length x) - 1) (flip (-) 1)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。