Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Function 编写第一个Haskell函数时遇到的问题_Function_Haskell_Functional Programming - Fatal编程技术网

Function 编写第一个Haskell函数时遇到的问题

Function 编写第一个Haskell函数时遇到的问题,function,haskell,functional-programming,Function,Haskell,Functional Programming,我是Haskell的新手,我的代码无法编译 multipleSum :: Int -> Int multipleSum x = let recSum 0 b = b recSum a b | a mod 3 == 0 = recSum a-1 b+a | a mod 5 == 0 = recSum a-1 b+a

我是Haskell的新手,我的代码无法编译

multipleSum :: Int -> Int
multipleSum x = let recSum 0 b = b
                    recSum a b | a mod 3 == 0     = recSum a-1 b+a
                               | a mod 5 == 0     = recSum a-1 b+a
                               | otherwise        = recSum a-1 b
                in recSum x 0 
这是我得到的两个错误,第一个发生在第3行,第二个发生在第6行。我做错了什么?(函数应为n以下3和5的所有倍数之和)


首先,您可以获得的类型签名越多,调试就越容易,所以我将它重写为

multipleSum :: Int -> Int
multipleSum x = recSum x 0

recSum :: Int -> Int -> Int
recSum 0 b = b
recSum a b | a mod 3 == 0     = recSum a-1 b+a
           | a mod 5 == 0     = recSum a-1 b+a
           | otherwise        = recSum a-1 b
a `mod` 3
在ghci或拥抱中点燃它

这样我就得到了一个关于mod 3的错误

好的,我必须用反勾号写中缀函数,所以应该是这样

recSum :: Int -> Int -> Int
recSum 0 b = b
recSum a b | a `mod` 3 == 0     = recSum a-1 b+a
           | a `mod` 5 == 0     = recSum a-1 b+a
           | otherwise        = recSum a-1 b
现在我在
recSum a-1 b+a
中得到了关于参数数量的错误。这是因为应该只有两个,所以如果我要传递比单个变量更复杂的东西,我需要括号,所以我应该写

recSum :: Int -> Int -> Int
recSum 0 b = b
recSum a b | a `mod` 3 == 0     = recSum (a-1) (b+a)
           | a `mod` 5 == 0     = recSum (a-1) (b+a)
           | otherwise        = recSum (a-1) b -- don't need brackets for b on its own

现在它已经编译好了,是时候用各种输入测试它了,看看它是否做了它应该做的事情。

您有两个与语法相关的问题。第一个与函数和运算符优先级有关。函数应用程序在Haskell中具有最高的优先级,因此
recSum a-1 b+a
(recSum a)-(1 b)+a
一样处理。相反,您需要编写
recSum(a-1)(b+a)

第二个问题是,
a mod 3
是用参数
mod
3
调用的函数
a
。要将
mod
用作

multipleSum :: Int -> Int
multipleSum x = recSum x 0

recSum :: Int -> Int -> Int
recSum 0 b = b
recSum a b | a mod 3 == 0     = recSum a-1 b+a
           | a mod 5 == 0     = recSum a-1 b+a
           | otherwise        = recSum a-1 b
a `mod` 3
把这两个变化放在一起,我们会

multipleSum :: Int -> Int
multipleSum x = let recSum 0 b = b
                    recSum a b | a `mod` 3 == 0  = recSum (a-1) (b+a)
                               | a `mod` 5 == 0  = recSum (a-1) (b+a)
                               | otherwise       = recSum (a-1) b
                in recSum x 0