2017-04-21 138 views
-2

我是Haskell的一名初学者。我写了一个小小的csv文件。如何将CSV转换为图形

csv = ["a1","b1","c1","d1"] 
     ["a2","b2","c2","d2"] 
     ["a3","b3","c3","d3"] 

我要转移到图相提并论:

graph :: [(Str,Str,Str)] 
graph :: [("a1","b","b1"), 
      ("a1","b","c1") 
      ("a1","b","d1")] 
a::[[str]] -> [String,String,String] 
f csv = ? 
test = a csv == graph 

你能解释一下我该怎么办呢TKS

+1

所以...你有什么问题吗?此外,Stackoverflow不一定是您完成作业的最佳地点。如果你有工作代码,那么你可以去代码审查stackexchange,并获得如何改进它的提示。这段代码是否编译?什么是它的一些输入和输出?输出应该在这里?你甚至没有真正提供过你的问题的描述。 – bheklilr

+0

我只想将一个列表拆分为m子列表 – Ada

+1

我建议您给http://stackoverflow.com/help/how-to-ask一个阅读,然后按照这些指导方针回来编辑您的问题。如果你付出一点努力,你会在这个网站上得到更好的回应。此外,通过写出一个很好的问题并解释你的思维过程可以帮助你更好地理解问题,并可能帮助你自己找到解决方案。这在过去几次发生在我身上。 – bheklilr

回答

1

编辑:哎呀,我错过了特殊的目的案件。修复了答案...

你的程序几乎是正确的,但不幸的是它不会输入检查。如果你使用GHC,你会得到一个可怕的错误,如下列:

Fsplit.hs:5:30: error: 
    • Couldn't match type ‘x’ with ‘[x]’ 
     ‘x’ is a rigid type variable bound by 
     the type signature for: 
      fsplit :: forall x. Eq x => Int -> [x] -> [[x]] 
     at Fsplit.hs:3:11 
     Expected type: [[x]] 
     Actual type: [x] 
    • In the expression: (l) 
     In the expression: 
     if n == 0 then (l) else (take n l) : (fsplit (m - 1) (drop n l)) 
     In an equation for ‘fsplit’: 
      fsplit m l 
      = if n == 0 then (l) else (take n l) : (fsplit (m - 1) (drop n l)) 
      where 
       n = div (length l) m 
    • Relevant bindings include 
     l :: [x] (bound at Fsplit.hs:5:10) 
     fsplit :: Int -> [x] -> [[x]] (bound at Fsplit.hs:4:1) 

重要的事情挑明此错误消息是:

  1. 第5行发生错误,列30(这在我的源文件对应于(l)then关键字后)
  2. 哈斯克尔期望的类型[[x]],但遇到的实际类型[x]
  3. 这件事发生时tryi纳克键入检查表达(l)

搞清楚这一个,可当你是新来的Haskell有点棘手,但问题是,你要处理的特殊情况下原来的列表l比返回原始列表的子列表大小要短。但是,l的类型为[x],某些类型的列表为x,但函数返回的值为[[x]],它是某种类型的列表x的列表。

这是一个暗示,你的程序中有一个逻辑错误。在这种特殊情况下(l太短),您并不是真的想要返回原始列表l,而是想要返回列表中只有子列表是列表l的子列表列表。也就是说,你想要回单列表[l]

fsplit m l = if (n==0) then [l] else (take n l):(fsplit (m-1)(drop n l)) 
      where n = div (length l) m 

,这应该很好地工作:

> fsplit 5 [] 
[] 
> fsplit 5 [1..10] 
[[1,2],[3,4],[5,6],[7,8],[9,10]] 
> fsplit 3 [1..10] 
[[1,2,3],[4,5,6],[7,8,9,10]] 
> fsplit 20 [1..10] 
[[1,2,3,4,5,6,7,8,9,10]]