2014-03-13 84 views
0

我想創建一個Haskell IO函數,它使用函數將一個數據類型的項添加到列表中,然後打印這些數據類型的列表。Haskell基本IO

DataType = Str Str Int [] 

它總是將相同的項目添加到列表中。

我有這個至今:

myFn = putStrLn(listAll (addData "a" "b" 2000 [] testDatabase)) 

,但我得到了以下錯誤:

:20想不出匹配類型[字符]與字符,期望的字符串,實際[字符串]

現在這可能是因爲listAll輸出了一個字符串列表,而putStrLn只能處理一個?但我不知道我該如何解決這個問題。

:19功能「一」被應用到3個參數

但是,「a」是不是一個函數,這是我想被加(許多混亂)的數據類型的一部分。

回答

4

您的問題是功能listAll返回[String],而putStrLn預計String。你有兩個基本的選擇 -

  1. 使用concatunlines

  2. 轉換的[String]String,例如反過來,通過使用類似mapM_

  3. 應用 putStrLn[String]的每個元素

對於選項1,您可以編寫

main = putStrLn $ unlines $ listAll (addData "a" "b" 2000 [] testDatabase) 

對於第二種情況,你可以寫

main = mapM_ putStrLn $ listAll (addData "a" "b" 2000 [] testDatabase) 
+0

好了,現在我有'FN = mapM_ putStrLn(listAll(addData(「a」「b」2000 [])testDatabase))',我現在得到的唯一錯誤是它說「a」適用於3個參數,當整個部分的意圖是addData的第一個參數,testDatabase是第二個參數。 – Chillo

+0

'addData'的類型是什麼? –

+1

@Chillo,this:'(「a」「b」2000 [])'沒有意義。你正在應用''一個''作爲一個函數給三個參數。 Haskell不需要括號來調用函數,函數應用程序簡單地並置。 –

2

您可以使用forM_從Control.Monad:

import Control.Monad 

myFn :: IO() 
myFn = forM_ (listAll (addData "a" "b" 2000 [] testDatabase)) putStrLn 
+0

工作,謝謝,但我現在留下第二個錯誤,在addData中,它說「一個」適用於3個論據,當它不是一個函數本身。我試圖通過添加從「a」到[]的括號來修復它,但它似乎不起作用。有任何想法嗎? – Chillo

+0

@Chillo - 你可以將addData的定義添加到問題中嗎?如果您沒有明確指定類型,可能會推斷出與您期望的不同。 – Lee

0

你的第二個錯誤是因爲"a" "b" 2000 []被解析功能的應用程序,與"a"作爲功​​能。你不能在Haskell中創建一個新的數據類型的值,只需列出它的子字段就可以了...首先需要有一個名爲的數據構造函數。到底該怎麼寫取決於你究竟如何定義新的數據類型,而是說你的類型聲明

data MyNewType = MyDataConstructorName String String Int [SomeTypeYouDidn'tMention] 

然後,讓你的價值表達的是

addData (MyDataConstructorName "a" "b" 2000 []) testDatabase 
+0

啊當然!完全錯過了。謝謝。 – Chillo