过去的纸质问题问我; 定义一个函数p :: [a] - > [a],它交换列表中的每两个项目.您的函数应该将第一个项与第二个项交换,第三个与第四个项交换,依此类推.通过递归来定义列表理解中的另一个.
这就是我提出的:
import Test.QuickCheck
p :: [a] -> [a]
p [] = []
p xs = concat [ [y,x] | ((x,y),i) <- zip (zip xs (tail xs)) [1..], odd i]
q :: [a] -> [a]
q [] = []
q (x:y:zs) | even (length zs) = [y,x] ++ q zs
| otherwise = error "The list provided is not of even length"
prop_2 xs = even (length xs) ==> p xs == q xs …Run Code Online (Sandbox Code Playgroud) 我的Haskell还有另外一个问题.我从一个问题中得到了以下数据构造函数,
type Point = (Int, Int)
data Points = Lines Int Int
| Columns Int Int
| Union Points Points
| Intersection Points Points
Run Code Online (Sandbox Code Playgroud)
它是关于网格起点(0,0)和(x,y)的点,x是距离原点的水平距离,y是距离原点的垂直距离.
我试图从中定义一个函数"Lines",给定xy行将评估网格上垂直距离x~y的所有点.例如
> Lines 2 4
(0,2)(1,2)(2,2)(3,2)....
(0,3)(1,3)(2,3)(3,3)....
(0,4)(1,4)(2,4)(3,4)....
Run Code Online (Sandbox Code Playgroud)
等等.那我做了什么,是,
Lines :: Int -> Int -> Points
Lines lo hi = [ (_, y) | lo <= y && y <= hi ]
Run Code Online (Sandbox Code Playgroud)
但哈斯克尔抱怨说;
无效的类型签名Lines :: Int - > Int - > Points.
应该是以下形式::
这是什么意思?"点数"已在上面定义......当然"Int""点数"被视为"类型"?我没有看到问题,为什么Haskell感到困惑?