gpt4 book ai didi

haskell - (Num (Int -> Int)) 没有因使用句法否定而产生的实例

转载 作者:行者123 更新时间:2023-12-01 23:42:47 25 4
gpt4 key购买 nike

我编写了以下 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) 被解释为 negative one,据我所知,这是唯一针对非二进制运算符的异常(exception)。 (-1) 因此不是减一的函数。

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

getSecondaryDiagonal x = getDiagonal' x ((length x) - 1) <b>(subtract 1)</b>

或者您可以使用 flip :: (a -> b -> c) -> b -> a -> c subtract 是如何实现的:

getSecondaryDiagonal x = getDiagonal' x ((length x) - 1) <b>(flip (-) 1)</b>

关于haskell - (Num (Int -> Int)) 没有因使用句法否定而产生的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64759247/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com