Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 从复杂字符串返回列表_Parsing_Haskell_Operators - Fatal编程技术网

Parsing 从复杂字符串返回列表

Parsing 从复杂字符串返回列表,parsing,haskell,operators,Parsing,Haskell,Operators,我从哈斯克尔开始 我想知道是否可以将字符串转换为不同元素类型的列表,如:“1*30%4”->['1'、'*'、'30'、'%'、'4'],而不使用Parsec 我已经找到了答案,但没有一个能真正帮助我。。。 类似于带有GHCI的映射(:[])“1*30%4” 或者借助于点缀 但我不知道如何保持正确的格式,例如,我的列表中不能有数字或浮点数/双精度,因为所有内容都被一个接一个地剪切:“1*30%4”->['1'、'*'、'3'、'0'、'%、'4']或“1*30.4%4”->['1'、'*'、'3

我从哈斯克尔开始

我想知道是否可以将字符串转换为不同元素类型的列表,如:
“1*30%4”->['1'、'*'、'30'、'%'、'4']
,而不使用Parsec

我已经找到了答案,但没有一个能真正帮助我。。。 类似于带有GHCI的
映射(:[])“1*30%4”
或者借助于
点缀

但我不知道如何保持正确的格式,例如,我的列表中不能有数字或浮点数/双精度,因为所有内容都被一个接一个地剪切:
“1*30%4”->['1'、'*'、'3'、'0'、'%、'4']
“1*30.4%4”->['1'、'*'、'3'、'0'、'4'、'4'.


有人能帮我吗

正如一些用户所指出的,您的返回类型是
[String]
,而不是
[Char]
。您可以通过以下方式轻松实现这一点:

import Data.Char
import Data.List

expresionToList :: String -> [String]
expresionToList = groupBy readAsNumber
  where readAsNumber c d = pred c && pred d
        pred x = isDigit x || x == '.'
  • pred
    函数的输入为数字或点时返回True,否则返回False

  • readAsNumber
    接受两个值,如果两个值都是数字或点,则返回True

  • 最后,您可以通过
    readAsNumber

您想使用Parsec这样的解析库还是仅仅使用vanilla Haskell?我实际上忘记了在Haskell不能容纳不同类型的元素中使用ParsecList。就像“30”不是一种字符类型,所以必须将其分为“3”和“0”才能将它们存储在列表中,比如说['1'、…'3'、'0'…]。你需要的东西可能是字符串列表,比如说[“1”、…“30”、“%”。]对吗?是的,正是因为有了“Words”函数,我的程序工作得很好,但我必须用空格分隔所有内容,这很烦人……解析器库有什么问题,它是适合这项工作的工具吗?我第一次听说“pred”。谢谢你的帮助,使用expresionList函数,我的问题就解决了。@astrocurieux
pred
函数在where子句中定义。它不是内置功能。