3

我正在尝试将我的 java 程序翻译成 Haskell。我的目标是将我的字符串分成几个字符串并将它们放在一个列表中。

到目前为止,这是我的代码

import Char
import IO
import Text.Regex

translate :: String -> Int
translate input = 
    testcode(splitRegex (mkRegex "\\s") input)

testcode 根据第一个值进行一些测试,例如(在运行中进行此操作还没有到这一步)

testcode :: [String] -> Int -> Int
testcode [] 0
testcode (x:xs)  n
     |(x=="test") = 1
     |otherwise = testcode xs

我不断收到的编译错误如下:

Could not find module `Text.Regex'
Perhaps you meant Text.Read (from base)

如何导入 Text.Regex?

4

2 回答 2

8

Text.Regexregex-compat包中。你安装了吗?

Cabal 是 haskell 的包管理器:http ://www.haskell.org/haskellwiki/Cabal/How_to_install_a_Cabal_package

要安装 regex 包,请输入以下 shell:

cabal install regex-compat

为了找出一个函数属于哪个包,我使用Hayoo!,它是 haskell 包存储库Hackage的搜索引擎。

于 2012-11-05T13:27:16.573 回答
2

首先,打开命令窗口并输入cabal install regex-compat. 这应该给你能力import Text.Regex

其次,如果再次发生这种情况,请对库进行 hayoo 搜索(全面但不加区分)或对函数进行 hoogle 搜索(不全面,但您甚至可以搜索函数的类型)。这样你就可以找出它所在的包,然后安装它。

第三,也许更重要的是,我是否可以建议在 Haskell 中有很好的、强大的方法来做事,这意味着您不需要太多地使用正则表达式。下面是一些例子:

words :: String -> [String]
words "Why not use some handy Haskell functions?" 
     = ["Why","not","use","some","handy","Haskell","functions"]

我想words给你你既定的目标。您可以使用大量出色的列表处理功能来替换次要的正则表达式作业,例如,混合

dropWhile :: (a -> Bool) -> [a] -> [a]
dropWhile (/=',') "Haskell is great, I love it."
     = ", I love it."

import Data.Char      -- (at the top of your code)
takeWhile :: (a -> Bool) -> [a] -> [a]
takeWhile isAlpha "Well then"
     = "Well"

with foldrorscanr可以用一种简洁的方式来表达你想要的东西。

通常列表处理功能就足够了,但是如果您手头有更专业的解析,那么优秀的解析库非常有用。它使得编写一个完整的解析器变得非常容易。了解它,因为一旦你这样做了,你就会想使用它而不是其他任何东西。

于 2012-11-05T14:34:19.633 回答