使用attoparsec在Haskell中重载字符串的问题

时间:2018-05-03 22:49:49

标签: parsing haskell attoparsec

首先,我想告诉您,我是Haskell的新手,我正在努力了解解析器在haskell中的工作原理。所以我基本上试图从http://www.gutenberg.org/files/57071/57071-0.txt解析这个电子书并分析文本。喜欢输出英文单词,句子和段落的数量等。 这是我的代码:

<View style={styles.messages}>
     <TouchableWithoutFeedback onPress={Keyboard.dismiss}>
          <FlatList
                ref={(c) => { this.flatList = c }}
                data = {this.props.messages}
                keyExtractor={item => item.id}
                renderItem = {({item}) => 
                  <MessageRow img={item.img}  
                  msg = {item.attributes} 
                  my_user_id={this.props.my_user_id}/>
                }
                inverted
              />  
     </TouchableWithoutFeedback>
</View>

这是我的错误消息:

  • 无法将类型'[Char]'与'Data.Text.Internal.Text'匹配;
      预期类型:Data.Text.Internal.Text;
      实际类型:字符串
  • 在'解析'的第二个参数中,即'输入' 在'($)'的第二个参数中,即'解析散文输入' 在'do'块的stmt中:print $ parse prose input

我使用“OverloadedStrings”尝试解决此问题,但它似乎无法正常工作。关于开始使用attoparsec的示例或教程的任何指导都将非常有用!

1 个答案:

答案 0 :(得分:3)

-XOverloadedStrings仅将字符串文字的类型从String更改为更一般的IsString a => a(可与String统一,{ {1}},Text等等。在您的代码中,只有一个文字:文件名ByteString

但是文件名总是"small.txt"好吧,String,但这只是FilePath的同义词。 (即使String函数也将文件名作为普通旧列表字符串。)因此,重载的字符串文字实际上并没有区别。

但是解析器不处理文件名而是处理内容,因此您需要做的是使用获取此内容的IO例程Data.Text.IO

Text