gpt4 book ai didi

haskell : Minimum position

转载 作者:行者123 更新时间:2023-12-02 10:16:55 29 4
gpt4 key购买 nike

我是 Haskell 术语的初学者。我必须做一个显示所有最低位置的练习。 例如: [1,2,3,1,1] => 0,3,4 这些是最小位置。 我尝试用两种方法来做到这一点,但这些都不起作用。 请有人帮我设计一个递归版本吗?

第一:

findPos :: [Int]->Int->[Int]
findPos list minimum (list) = [index | (index, e) <- zip [0..] list, e == minimum (list)]

第二:

findPos :: [Int]->Int->[Int]
findPos list (minim el) = [index | (index, e) <- zip [0..] list, e == (minim el)]


minim :: [Int] -> Int
minim x = if (tail(x)==[]) then head(x)
else n
where n = minim (tail(x))
n = if n < head(x) then n
else head(x)

最佳答案

代码的严重问题是函数定义的左侧有一些奇怪的东西。

在第一种情况下,您有:

findPos :: [Int] -> Int-> [Int]
findPos list minimum (list) = …

这是什么意思?从您给 findPos 的签名来看,它需要一个列表和我们正在查找的元素。所以定义必须是:

findPos list m = [index | (index, e) <- zip [0..] list, e == m]

在这种情况下,无需调用右侧的 minim 函数,而是必须在调用 之前调用 minim findPos 向其传递最小元素,如下所示:

findPos' :: [Int] -> [Int]
findPos' list = findPos list (minim list)

或者您可以将定义更改为:

findPos :: [Int] -> [Int]
findPos list = [index | (index, e) <- zip [0..] list, e == minim list]

在这种情况下,您确实在右侧调用了 minim,但 findPos 的签名变得不同。

<小时/>

现在讨论递归最小函数。您确实应该尽可能多地使用模式匹配:

minim :: [Int] -> Int
minim (x : []) = x
minim (x : xs) = if x < m then x else m
where
m = minim xs

否则,除了定义 n 两次之外,您的 minim 几乎是正确的。

关于 haskell : Minimum position,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30119252/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com