2017-04-21 66 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]]