从Haskell中的文本文件创建多边形列表

杰克·麦克劳克林

我已经阅读了一个数字文件并从中创建了一个数字列表,现在,我想根据列表中的数字创建一个多边形列表,因为它们具有特定的布局/图案。

type Point = (Double, Double)

data Polygon = Polygon { v :: Int
                       , y :: Int
                       , points :: [Point]  
                       }

main = do  
    let list = []
    handle <- openFile "polycake.in" ReadMode
    contents <- hGetContents handle
    let singlewords = words contents
        list = fileToList singlewords
        n = list!!0
        list' = drop 1 list
        polygons = polyList n list'  
    hClose handle 

fileToList :: [String] -> [Int]
fileToList = map read

polyList :: Int -> [Int] -> [Polygon]
polyList n [] = return []
polyList n list = do
    let v = list!!0
        y = list!!1
        list' = drop 2 list
        pointList = take (2*v) list'
        points = getPoints pointList
        list'' = drop (2*v) list'
        poly = Polygon { v = v, y = y, points = points}
        nextPoly = polyList (n-1) list''
    return (poly:nextPoly)

getPoints :: [Int] -> [Point]
getPoints (k:v:t) = (fromIntegral k, fromIntegral v) : getPoints t

但是我得到的错误:

polycake.hs:27:17: error:
     • Couldn't match type ‘[a0]’ with ‘Polygon’
      Expected type: [Polygon]
        Actual type: [[a0]]
     • In the expression: return []
      In an equation for ‘polyList’: polyList n [] = return []
   |
27 | polyList n [] = return []
   |                 ^^^^^^^^^

polycake.hs:37:5: error:
    • Couldn't match type ‘[Polygon]’ with ‘Polygon’
      Expected type: [Polygon]
        Actual type: [[Polygon]]
    • In a stmt of a 'do' block: return (poly : nextPoly)
      In the expression:
        do let v = list !! 0
               y = list !! 1
               ....
           return (poly : nextPoly)
      In an equation for ‘polyList’:
          polyList n list
            = do let v = ...
                     ....
                 return (poly : nextPoly)
   |
37 |     return (poly:nextPoly)
   |     ^^^^^^^^^^^^^^^^^^^^^^

我不确定为什么会出现这些错误。

样品polycake.in:

2
4 2
0 0
4 0
4 4
0 4
6 10
3 15
10 1
12 5
11 19
9 23
6 20

因此,第一行是测试用例的数量,每个测试用例以2个数字开头,第一个是顶点数,第二个是用于后续计算的ay值。然后,以下v对是顶点或点。

切普纳

您正在滥用do符号和return功能。return不仅仅是用于指定函数返回值的关键字;它用于在Monadic类型的值内部“包装”一个值。虽然[]是monad,但您并未在函数中使用它。

polyList :: Int -> [Int] -> [Polygon]
polyList n [] = []
polyList _ [x] = error "Too few points remaining"
polyList n (v:y:list') =
    let pointList = take (2*v) list' -- Note: list' may not *have* 2*v points
        points = getPoints pointList
        list'' = drop (2*v) list'
        poly = Polygon { v = v, y = y, points = points}
        nextPoly = polyList (n-1) list''
    in (poly:nextPoly)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从文本文件获取坐标行并检查点是否在多边形内

从文本文件中创建列表并比较列表

如何从R中的列表创建自动文本文件?

创建内容在mkdir列表中的文本文件

从列表中的每个链接创建文本文件?

从C#中的文本文件创建数组列表

如何从XML文件在Java中创建多边形

从文本文件创建字典列表

从文本文件创建连接列表

从多边形列表中减去内环

OpenModelica中的多边形创建

在多边形中创建圆角的算法

使列表中的文本文件从Java?

使用文本文件创建列表,然后使用列表从网页中抓取来创建字典

从Haskell中的文本文件读取后如何在列表中添加元组

从文本文件列表创建文件

从 PostGiS 中同一个表的文本字段创建多边形几何

C ++:从带有孔的多边形中获取简单多边形的列表

尝试删除从文本文件创建的列表的项目

批量创建基于列表的文本文件

填充多部分多边形中的间隙而不创建重叠多边形

使用javascript在SVG中的大多边形内创建小多边形

如何从较小的多边形中创建较大的多边形

当我们有了坐标列表时,如何在JTS中创建多边形?

将多个点放在列表中?- 创建一个多边形

使用Python列表创建多边形的坐标

如何从形状点列表创建形状的多边形?

如何解析python中的文本文件以创建删除重复项的排序列表

Spark-从文本文件中创建单词列表以及紧随其后的单词