Function 哈斯克尔为什么不高兴?它';It’他在抱怨我的打字签名

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是距原点的垂直距离 我试图从中定义一个

我的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是距原点的垂直距离

我试图从中定义一个函数“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), ...]]