Haskell的问题:如果列表中的所有数字之间的差超过2,则打印true



我目前拥有的haskell代码给出了一个错误:

main.hs:16:4: error:
* Couldn't match expected type `Bool' with actual type `[Bool]'
* In the expression: map alternateMoreThan2 xs
In an equation for `function':
function xs = map alternateMoreThan2 xs
|
16 |    map alternateMoreThan2 xs
|    ^^^^^^^^^^^^^^^^^^^^^^^^^
main.hs:16:27: error:
* Couldn't match type `Int' with `[Int]'
Expected type: [[Int]]
Actual type: [Int]
* In the second argument of `map', namely `xs'
In the expression: map alternateMoreThan2 xs
In an equation for `function':
function xs = map alternateMoreThan2 xs
|
16 |    map alternateMoreThan2 xs
|                           ^^
<interactive>:3:1: error:
* Variable not in scope: main
* Perhaps you meant `min' (imported from Prelude)

我的代码如下:

differenceCalc :: Int -> Int -> Int
differenceCalc x y = abs(x - y)
alternateMoreThan2 :: [Int] -> Bool
alternateMoreThan2 (x:y:xs:ys)
| differenceCalc x y > 2 = True
| otherwise = False
function :: [Int] -> Bool
function xs =
map alternateMoreThan2 xs
main :: IO()
main
= putStrLn(show(function[24,21,25,17,50,100]))

我对迭代有问题。在我换衣服之前,它检查了前两双,但仅此而已。只是很困惑。谢谢

map将调用函数,此处为列表中每个元素上的alternateMoreThan2。因此,对于Int[1,4,2,5]的列表,它将尝试调用alternateMoreThan2 1alternateMoreThan2 4alternateMoreThan2 2alternateMoreThan2 5。但这在这里没有多大意义,因为alternateMoreThan2期望Ints的列表。

此外,alternateMoreThan2仅适用于包含至少三个元素的列表。对于包含零、一或两个元素的列表,它将引发一个异常。

如果您想检查任何两个连续元素的差异是否大于2,您应该在列表中递归,因此:

alternateMoreThan2 :: [Int] -> Bool
alternateMoreThan2(x:xs@(y:_))= differenceCalc x y > 2 &&alternateMoreThan2 xs
alternateMoreThan2 _ = True

或者你可以使用tails和列表理解:

import Data.List(tails)
alternateMoreThan2 :: [Int] -> Bool
alternateMoreThan2ys=and[differenceCalc x y > 2 |(x:y:_) <- tails ys]

对于每两个元素,我们也可以使用列表理解:

import Data.List(tails)
alternateMoreThan2 :: [Int] -> Bool
alternateMoreThan2zs=and[differenceCalc x y > 2 |(x:ys) <- tails zs, y <- ys]

但在这种情况下,更聪明的检查方法是先按升序/降序排列元素,然后每隔两对连续的元素进行检查。

在Haskell程序中,您可以使用进行检查

main :: IO()
main = print (alternateMoreThan2[24,21,25,17,50,100])

最新更新