小编Adi*_*Adi的帖子

Haskell字符串标记化函数

我在Haskell中需要一个String tokenizer,但在Prelude或其他模块中显然没有定义任何内容.Data.Text中有splitOn,但这很难用,因为你需要将String包装到Text.

令牌器不是很难做到这一点我写了一个(它不处理多个相邻的分隔符,但它适用于我需要它).我觉得这样的事情应该已经在模块中了.

这是我的版本

tokenizer :: Char -> String -> [String]
tokenizer delim str = tokHelper delim str []

tokHelper :: Char -> String -> [String] -> [String]
tokHelper d s acc 
    | null pos  = reverse (pre:acc)
    | otherwise = tokenizer d (tail pos) (pre:acc)
        where (pre, pos) = span (/=d) s
Run Code Online (Sandbox Code Playgroud)

我在互联网上搜索了更多解决方案并找到了一些讨论,比如这篇博文.

最后一条评论(由Mahee于2011年6月10日发布)特别有趣.为什么不使一个版本的单词功能更通用来处理这个?我试着搜索这样的功能但没找到..

有没有更简单的方法,或者'标记'字符串不是一个非常反复出现的问题?:)

haskell functional-programming ghc haskell-platform

9
推荐指数
2
解决办法
3258
查看次数

懒惰和功能组成(haskell,erlang)

有人可以解释或提供一些关于功能组合如何与懒惰相关的资源吗?

例如filter (/='W') . map toUpper $ "justaword",Haskell的工作方式与erlang中的对应方式相比如何?

erlang haskell functional-programming lazy-evaluation

9
推荐指数
1
解决办法
7172
查看次数

Haskell列表理解可变数量的字符串

如果我有两个字符串,我使用列表推导来获得所需的结果:

 combineStrings firstStr sndStr = [ [a,b] | a <- firstStr, b <- sndStr]
Run Code Online (Sandbox Code Playgroud)

对于三个字符串,我使用它

 combineStrings firstStr sndStr trdStr = [ [a,b,c] | a <- firstStr, b <- sndStr, c <- trdStr]
Run Code Online (Sandbox Code Playgroud)

我正在尝试的是获得可变数量的字符串相同的结果.例如,如果我有一个采用以下形式的函数:

 combineStrings :: [String] -> [String]
Run Code Online (Sandbox Code Playgroud)

我试图获得与上面2,3,... n列表相同的结果......我尝试了多种方式,比如这个

 combineStrings []      = []
 combineStrings (hd:tl) = [ a:b | a <- hd, b <- combineStrings tl]
Run Code Online (Sandbox Code Playgroud)

但是因为第一个条款的[]而失败了.有人可以帮我写这个吗?

haskell list-comprehension ghc

6
推荐指数
2
解决办法
1453
查看次数

使用foldl',foldr列出连接

我现在正在学习Haskell,我遇到了以下问题:

我想用foldl'和foldr重写++函数.我用foldr完成了它:

myConcat xs ys = foldr (:) ys xs
Run Code Online (Sandbox Code Playgroud)

我不能用foldl'来做.我在RealWorldHaskell中读过,foldr对于做这种事情非常有用.好的,但是我不能用foldl写一个等价的++?有人可以告诉我如何做到这一点(如果可以做到......这本书没有提到任何关于它的事情)......

Haskell的类型机制阻止我这样做吗?每次我尝试我都会遇到类型错误...

haskell ghc

3
推荐指数
2
解决办法
6285
查看次数

Haskell函数定义语法

我正在通过以下方式进行列表连接(例如,使用GHC):

myConcat :: [[a]] -> [a]
myConcat xs = foldr (++) [] xs
myConcat    = foldr (++) []
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释一下上述定义为何以及如何运作,而且这个定义没有:

myConcat xs = foldr (++) []
Run Code Online (Sandbox Code Playgroud)

是故意不允许的最后一行代码(由于构造可能会变得混乱,它是无用的等原因)或者是更深层次的东西,可能与currying有关...

我希望我能对此有所了解,这真让我感到困惑:/

后期编辑:除了下面给出的解释,我已经找到了关于这个问题的一个很好的信息来源,作为Chap的"部分功能应用和currying"部分.4"功能编程"来自"真实世界Haskell"一书.这本书可以在线免费获得.

haskell functional-programming currying

3
推荐指数
1
解决办法
648
查看次数

sed,替换#include中的反斜杠

我希望用斜杠替换所有反斜杠(与include指令在同一行上出现).

这是我到现在为止所拥有的......

echo '#include "..\etc\filename\yes"' | sed 's&\(#include.*\)\\&\1\/&g'
Run Code Online (Sandbox Code Playgroud)

这可以按照我的预期工作,但问题是它一次只替换一个\ ...如果我想在上面的文本中替换所有三个,我必须运行sed命令3次... g标志在最终应该在全球范围内进行替换,不是吗?

我在Ubuntu 11.10上使用sed 4.2.1 ...

regex linux bash scripting sed

2
推荐指数
1
解决办法
755
查看次数