Haskell 添加一个以返回值?

Haskell 添加一个以返回值?,haskell,Haskell,我有以下代码: testFunc as (b:bs) | b `elem` as = testFunc as bs + 1 | otherwise = testFunc as bs 如果第二个参数(bs)的头不是第一个参数(a)中列表的元素,则递归调用该函数,并将+1添加到最终结果中。然而,我不明白的是,如何添加1。毕竟,函数只接受两个参数?+1不是testFunc的另一个(或两个以上)参数,它是对testFunc返回的值的修改 用括号查看可能更容

我有以下代码:

testFunc as (b:bs) 
          | b `elem` as = testFunc as bs + 1
          | otherwise   = testFunc as bs

如果第二个参数(
bs
)的头不是第一个参数(
a
)中列表的元素,则递归调用该函数,并将+1添加到最终结果中。然而,我不明白的是,如何添加1。毕竟,函数只接受两个参数?

+1
不是
testFunc
的另一个(或两个以上)参数,它是对
testFunc
返回的值的修改

用括号查看可能更容易:

testFunc as (b:bs) 
      | b 'elem' as = (testFunc as bs) + 1
      | otherwise   = testFunc as bs

所以在第一种情况下,我们进行递归调用,得到一个值。然后我们加上一个。在第二种情况下,我们进行递归调用,然后返回未修改的值。

+1
不是
testFunc
的另一个(或两个以上)参数,它是对
testFunc
返回的值的修改

用括号查看可能更容易:

testFunc as (b:bs) 
      | b 'elem' as = (testFunc as bs) + 1
      | otherwise   = testFunc as bs

所以在第一种情况下,我们进行递归调用,得到一个值。然后我们加上一个。在第二种情况下,我们进行递归调用,然后返回未修改的值。

您必须查看类型签名

testfunc Num b, Eq a => [a] -> [a] -> b
testfunc _ [] = 0 -- the base case you ommited
testFunc as (b:bs) 
          | b `elem` as = (testFunc as bs) + 1
          | otherwise   = testFunc as bs

因此,在testfunc的结果中添加1(这是一个数字)

您必须查看类型签名

testfunc Num b, Eq a => [a] -> [a] -> b
testfunc _ [] = 0 -- the base case you ommited
testFunc as (b:bs) 
          | b `elem` as = (testFunc as bs) + 1
          | otherwise   = testFunc as bs

因此,在testfunc的结果中添加1(它是一个数字)

这被解析为
(testfunc as bs)+1
,函数应用程序在操作顺序上比所有运算符绑定得更紧密。一般来说,我更喜欢添加显式括号,因为它会生成安全、可读的代码。这在你学习的时候特别有用。考虑函数<代码> f:INT> int INT/COD>。如果您看到
fx+1
,Haskell会将其解析为
(fx)+1
,但您可能想将其解析为
f(x+1)
,而不熟悉Haskell的人也不知道它的解析方式。@Eric,多余的括号可能会分散注意力。我通常希望代码中的符号能起作用;当他们没有的时候,我必须盯着他们看一会儿,意识到我需要过滤掉他们。当然也有例外,但学习Haskell的一部分是习惯函数应用程序的语法,以及它比其他任何东西都绑定得更紧密的事实。@dfeuer在我的示例中,
f
+
都是函数,因此“函数绑定得更紧密”的规则没有帮助。这里的根是优先权。我已经做了很长时间了,但仍然没有记住。这被解析为
(testFunc as bs)+1
,函数应用程序在操作顺序上比所有运算符绑定得更紧密。一般来说,我更喜欢添加显式括号,因为它会生成安全、可读的代码。这在你学习的时候特别有用。考虑函数<代码> f:INT> int INT/COD>。如果您看到
fx+1
,Haskell会将其解析为
(fx)+1
,但您可能想将其解析为
f(x+1)
,而不熟悉Haskell的人也不知道它的解析方式。@Eric,多余的括号可能会分散注意力。我通常希望代码中的符号能起作用;当他们没有的时候,我必须盯着他们看一会儿,意识到我需要过滤掉他们。当然也有例外,但学习Haskell的一部分是习惯函数应用程序的语法,以及它比其他任何东西都绑定得更紧密的事实。@dfeuer在我的示例中,
f
+
都是函数,因此“函数绑定得更紧密”的规则没有帮助。这里的根是优先权。我已经做了很长时间了,但仍然没有记住。