Haskell Basic IO

时间:2014-03-13 13:32:01

标签: haskell

我想创建一个Haskell IO函数,该函数使用函数将数据类型的项添加到列表中,然后打印这些数据类型的列表。

DataType = Str Str Int []

它总会将相同的项目添加到列表中。

到目前为止,我有这个:

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

但我收到以下错误:

  

:20无法匹配[Char]类型与Char,期望字符串,实际[String]

现在这可能是因为listAll输出了一个字符串列表,而putStrLn只能处理一个字符串?但我不确定如何解决这个问题。

  

:19函数“a”应用于3个参数

但是“a”不是一个函数,它是我想要添加的数据类型的一部分(很混乱)。

3 个答案:

答案 0 :(得分:4)

您的问题是函数listAll返回[String],而putStrLn则需要String。你基本上有两个选择 -

  1. [String]转换为String,例如使用concatunlines

  2. 使用putStrLn

  3. 之类的内容依次将[String]应用于mapM_的每个元素

    对于选项1,您可以写

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

    对于选项2,您可以写

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

答案 1 :(得分:2)

您可以使用Control.Monad中的forM_

import Control.Monad

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

答案 2 :(得分:0)

您的第二个错误是因为"a" "b" 2000 []被解析为函数应用程序,并以"a"为函数。您不能仅仅通过列出其子字段来在Haskell中创建新数据类型的值......首先需要有一个数据构造函数名称。究竟要写什么取决于你如何定义新的数据类型,但是你的类型声明是

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

然后用于创建值的表达式为

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