我目前拥有的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 1
、alternateMoreThan2 4
、alternateMoreThan2 2
和alternateMoreThan2 5
。但这在这里没有多大意义,因为alternateMoreThan2
期望Int
s的列表。
此外,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])