Haskell - 如何创建一个执行if检查然后返回值的函数?

时间:2018-04-08 21:30:41

标签: haskell functional-programming

我有这段python代码,我想将其翻译成haskell:

T = int(input())
for t in range(0, T):

  n = int(input())
  a = list(map(int, input().split()))

  lis = [[0 for j in range(0, n)] for i in range(0, n)]

  for i in range(0, n):
      for j in range(i, n):
          val = 1
          for k in range(i, j):
              if(a[k] < a[j] and 1 + lis[i][k] > val):
                  val = 1 + lis[i][k]
          lis[i][j] = val
  ans = ''

我希望能够在haskell中创建一个可以执行此操作的函数。但是,该程序基本上取自诸如

之类的输入
1
5
1 2 9 6 8

其中第一行是测试用例的数量,第二行是特定测试用例中的数字,第三行是测试用例本身。它正在寻找测试用例中的多个递增序列

2 个答案:

答案 0 :(得分:2)

提问

  

如何创建一个执行if检查然后返回值的函数?

如果这确实是你的问题,这将回答它:

fun :: () -> String
fun () = if 5 > 6 then "You're nuts!" else "Obviously!"

但也许你的标题应该是“Haskell中的多个增加序列”。

  

我有这条python代码,我想将其转换为Haskell:[...]

     

我希望能够在Haskell中创建一个可以执行此操作的函数。

所以你想翻译一些代码;但你的问题是什么?您是否要求其他人翻译,或提供有关如何翻译特定位的提示?或者更一般地说,如何从一种编程范式转换为另一种编程范式?

其他人如何让您在Haskell中创建这样的功能?如果你坚持“如何制作一个函数和一个if子句?”,那么你的问题可能应该是How to get started with Haskell?请记住你点击了“提问”按钮,而不是“制作需求”按钮。 ; - )

  

该程序主要取自

等输入
1
5
1 2 9 6 8
     

其中第一行是测试用例的数量,第二行是特定测试用例中的数字,第三行是测试用例本身。它正在寻找测试用例中的多个递增序列

这似乎是实际的问题,除了你没有真正说出“多个增加序列”问题是什么。如果您需要有关解决问题的帮助,您必须说明问题。

在Haskell

中构建算法

在不确切知道您的问题是什么的情况下,似乎它包含从标准输入解析的n个子问题;每个子问题都包含在一个整数数组中。所以你至少可以建立以下两个部分:

  1. 通过I / O解决问题:

    import Control.Monad (replicateM)
    
    -- Read a line that contains an Int.
    readInt :: IO Int
    readInt = undefined
    
    -- Read a line that contains multiple Ints.
    readInts :: IO [Int]
    readInts = fmap (map read . words) getLine
    
    -- Read n problems.
    readProblems :: IO [[Int]]
    readProblems = readInt >>= \n -> replicateM n (readInt >> readInts)
    
  2. 解决没有I / O的问题:

    solveProblem :: [Int] -> Int
    solveProblem ns = undefined
    
  3. 将这些部分拼凑在一起:

    main :: IO ()
    main = do
      problems <- readProblems
      forM problems (print . solveProblem)
    

答案 1 :(得分:1)

我将准确地回答你的问题,但是当你从python或其他面向对象语言转换为函数式编程时,你无法以完全相同的方式进行。大多数时候,你必须提出一点点不同的逻辑。我很难为你提供更多帮助,因为你发送了一小段代码而且信息很少。

但是,你可能想要一些函数,它正在处理你在这段代码中使用的所有变量,所以对于这个函数我也认为a, k, j, i, val, lis最好使用返回类型{{1} },如果你没有更改val或Maybe新值,它将返回Nothing。对于数组/列表索引,您可以使用运算符Just val

!!

但就像我之前说过的那样......我认为你可能正在做一些循环等等。为此,在Haskell中使用模式匹配和递归要好得多......

希望我能帮助你......