Function 哈斯克尔为什么不高兴?它';It’他在抱怨我的打字签名
我的Haskell还有一个问题。我从一个问题中得到了以下数据构造函数Function 哈斯克尔为什么不高兴?它';It’他在抱怨我的打字签名,function,haskell,types,constructor,Function,Haskell,Types,Constructor,我的Haskell还有一个问题。我从一个问题中得到了以下数据构造函数 type Point = (Int, Int) data Points = Lines Int Int | Columns Int Int | Union Points Points | Intersection Points Points 这是关于网格上的点,从(0,0)和(x,y)开始,x是距原点的水平距离,y是距原点的垂直距离 我试图从中定义一个
type Point = (Int, Int)
data Points = Lines Int Int
| Columns Int Int
| Union Points Points
| Intersection Points Points
这是关于网格上的点,从(0,0)和(x,y)开始,x是距原点的水平距离,y是距原点的垂直距离
我试图从中定义一个函数“Lines”,给定线xy,它将计算网格上垂直距离为x~y的所有点。
e、 g
等等。我所做的是
Lines :: Int -> Int -> Points
Lines lo hi = [ (_, y) | lo <= y && y <= hi ]
line::Int->Int->Points
行lo hi=[(uuy,y)| lo点。
应采用以下形式:
这是什么意思?上面已经定义了“点”…当然“Int”“点”被视为“类型”?我看不出问题所在,为什么Haskell会感到困惑
函数不能以大写字母开头。因此您需要使用行
,而不是行
。这可能是您看到的错误消息的来源
语法[…]
用于创建结果列表,但您的类型签名声明函数返回点
,这不是任何类型的列表。如果您要返回点
值列表,则为[点]
类型
我完全不知道你的行的实现要做什么。语法对我来说毫无意义
好的,考虑到你的评论
- 您可以通过写入
[lo..hi]
来生成介于lo
和hi
之间的数字列表
- 你说一个“任意”值可以在X中,但你需要确切地说明这意味着什么。你的例子似乎表明你希望数字永远从0向上。生成该列表的方法是
[0..]
(不给出上限会使列表无穷无尽。)
- 您的示例表明您需要一个列表列表,其中内部列表包含具有相同Y坐标的所有点以及所有可能的X坐标
因此,这里有一种可能的方法:
type Point = (Int, Int)
lines :: Int -> Int -> [[Point]]
lines lo hi = [ [(x,y) | x <- [0..]] | y <- [lo .. hi] ]
换句话说,外部列表有3个元素(Y=2、Y=3和Y=4),三个内部列表中的每一个都是无限长的(每个可能的正X值)
函数不能以大写字母开头。因此您需要使用行
,而不是行
。这可能是您看到的错误消息的来源
语法[…]
用于创建结果列表,但您的类型签名声明函数返回点
,这不是任何类型的列表。如果您要返回点
值列表,则为[点]
类型
我完全不知道你的行的实现要做什么。语法对我来说毫无意义
好的,考虑到你的评论
- 您可以通过写入
[lo..hi]
来生成介于lo
和hi
之间的数字列表
- 你说一个“任意”值可以在X中,但你需要确切地说明这意味着什么。你的例子似乎表明你希望数字永远从0向上。生成该列表的方法是
[0..]
(不给出上限会使列表无穷无尽。)
- 您的示例表明您需要一个列表列表,其中内部列表包含具有相同Y坐标的所有点以及所有可能的X坐标
因此,这里有一种可能的方法:
type Point = (Int, Int)
lines :: Int -> Int -> [[Point]]
lines lo hi = [ [(x,y) | x <- [0..]] | y <- [lo .. hi] ]
换句话说,外部列表有3个元素(Y=2、Y=3和Y=4),三个内部列表中的每一个都是无限长的(每个可能的正X值)。X值在行中从何而来?是否要构造一个无限列表的列表?然后尝试行的lohi=map(\Y->map(\X->(X,Y))[0..]
。请注意,已经有一个名为行的函数。行中的x值来自何处
?是否要构造一个无限列表的列表?然后尝试行的lo hi=map(\y->map(\x->(x,y))[0..])[lo hi
。注意,已经有一个名为行的函数了。
。您好,谢谢您的回答!好的,我将尝试将大写字母改成小写……好的,>行只是尝试生成一组给定lo,Hi的点(Int,Int)。(\uy,y)这意味着任意数字进入x项,y大于或等于lo,小于或等于hi。至少这是我的本意…我一生中从未做过编程,我对自己的技能真的不自信…@Brad List的理解语法基本上是xs=[val | val
。在英语中,xs是一个值列表,每个值都是从一个名为someList
的列表中提取出来的,该列表过滤掉任何未通过布尔保护的值。Haskell不会神奇地为您发明值,您必须显式指定x
,而不是使用下划线,并且必须指定基本列表。因此,也许<代码>行lo hi=[(1,y)| y=lo,y我敢打赌实际需要的是<代码>行lo hi=[(x,y)| y hi,谢谢你的回答!好的,我会尝试将大写字母改成小写…嗯>行只是试图生成一组给定lo,hi的点(Int,Int)。(|这意味着任意数字进入x项,y大于或等于lo,小于或等于hi。至少这是我的本意…我一生中从未做过编程,我对自己的技能真的不自信…@Brad List的理解语法基本上是xs=[val | val
。在英语中,xs是一个值列表,每个值都是从一个名为someList
的列表中提取的,该列表过滤掉任何未通过布尔保护的值。Haskell不会神奇地为您发明值,您必须显式指定x
lines lo hi =
let
xs = [0..]
ys = [lo .. hi]
in [ [(x,y) | x <- xs] | y <- ys]
> lines 2 4
[[(0,2), (1,2), (2,2), ...],
[(0,3), (1,3), (2,3), ...],
[(0,4), (1,4), (2,4), ...]]