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



我有一段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

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

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

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

fun a k j i val lis 
| a!!k < a!!j && 1 + (lis!!i)!!k > val = Just (1 + (lis!!i)!!k)
| otherwise = Nothing

但就像我之前说的...我想你可能正在为周期等做一些事情。为此,最好在 Haskell 中使用模式匹配和递归......

希望我能帮到你...

关于提问

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

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

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

但也许你的标题应该是"哈斯克尔中的多个递增序列"。

我有一段 python 代码,我想翻译成 Haskell:[...]

我希望能够在Haskell中创建一个可以做到这一点的函数。

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

其他人如何使您能够在 Haskell 中创建这样的函数?如果你被困在"我如何制作函数和if子句?",那么你的问题应该是如何开始使用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)
    

最新更新