如何在Haskell中使用我的递归函数?

时间:2016-02-12 02:55:26

标签: c++ haskell recursion

lol :: IO int
lol = go -1 0 0 0
where go k m n p = case k of
        -1 -> do{
                q <- readLn ;
                go 0 0 0 q
            }
        p -> do{
                putStrLn $ show $ n
            }
        _ -> do{
                q <- readLn ;
                go (k+1) q (if q > m then n+q-m else n) p
                return()
            }

我(一个haskell初学者)正在做一些练习题。我写了一个递归函数,但我不知道如何在main中使用它。请帮我解决这个问题。这是我在C ++中的想法,我接受了它。

#include<iostream>
using namespace std;
int main(){
    long long int prev=0;
    long long int count,ans=0;
    cin >> count;
    long long int p;
    for(int i=0; i<count ;i++){
        cin >> p;
        if(p>prev){
            ans+=p-prev;
        }
        prev=p;
    }
    cout << ans << endl;
}

2 个答案:

答案 0 :(得分:2)

有几种语法错误:

  • 在将负数用作参数
  • 时,在负数周围添加括号
  • 为了避免在模块块中开始一个新行,缩进where(以及所有后续行)
  • 将缺少的分号添加到return ()
  • 之前的行

还有一个类型错误:你应该写lol :: IO ()。修复这些内容后,您可以编写main = lol来使用它(或只是将其命名为main而不是lol)。不知道它是否能完成它应该做的事情,但这似乎是你应该能够在它运行后进行测试的东西。

答案 1 :(得分:2)

这个怎么样?我只是直接从C ++中翻译它

module Main where


go :: Int -> Int -> Int -> IO Int
go i prev acc
  | i > 0   = do p <- readLn
                 if p > prev
                   then go (i-1) p (acc + (p - prev))
                   else go (i-1) p acc
  | otherwise = return acc

main :: IO ()
main = do
  count <- readLn :: IO Int
  ans <- go count 0 0
  print ans