我想创建一个Haskell IO函数,该函数使用函数将数据类型的项添加到列表中,然后打印这些数据类型的列表。
DataType = Str Str Int []
它总会将相同的项目添加到列表中。
到目前为止,我有这个:
myFn = putStrLn( listAll ( addData "a" "b" 2000 [] testDatabase ) )
但我收到以下错误:
:20无法匹配[Char]类型与Char,期望字符串,实际[String]
现在这可能是因为listAll输出了一个字符串列表,而putStrLn只能处理一个字符串?但我不确定如何解决这个问题。
:19函数“a”应用于3个参数
但是“a”不是一个函数,它是我想要添加的数据类型的一部分(很混乱)。
答案 0 :(得分:4)
您的问题是函数listAll
返回[String]
,而putStrLn
则需要String
。你基本上有两个选择 -
将[String]
转换为String
,例如使用concat
或unlines
使用putStrLn
[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