我试图将一个字符串数组划分为子数组。我正在尝试以下内容;
content <- readFile "/tmp/foo.txt"
let all_paragraphs = lines content
let number = elemIndex "I THE LAY OF THE LAND" all_paragraphs
let number2 = elemIndex "IV THE MOST INTELLIGENT ANIMALS" all_paragraphs
是否可以将内容解析为数组; 让new_array = all_paragraphs [number,number2]或让new_Array = all_paragraphs(number:number2)一个类似的代码?
答案 0 :(得分:2)
你可能在讨论列表,而不是数组,因为Haskell的Prelude和lines中没有数组返回[String]
,即字符串列表。
所以你想从索引n
获取列表的索引m
的子列表?您可以将drop和take组合使用。
然而,这不是惯用的函数式编程,因为它不容易出错(例如,逐个错误)并且有更好的方法,因此不鼓励显式处理索引。因此,您似乎希望获得行I THE LAY OF THE LAND
和行IV THE MOST INTELLIGENT ANIMALS
之间的所有行。你可以用惯用的Haskell做到:
main :: IO ()
main = do
content <- readFile "/tmp/foo.txt"
let ls = excerpt $ lines content
-- the dollar just rearranges precedence, so this is the same as:
-- ... = excerpt (lines content)
print ls
-- do as little as possible in monads (the thing with `do ... let <- ...` etc)
-- rather define pure functions like this one and use them above...
excerpt :: [String] -> [String]
excerpt xs = takeWhile (/= "IV THE MOST INTELLIGENT ANIMALS")
$ dropWhile (/= "I THE LAY OF THE LAND") xs
-- the excerpt function could alternatively also be written as
-- the composition of `takeWhile x` and `dropWhile y`
excerpt :: [String] -> [String]
excerpt = takeWhile (/= "IV THE MOST INTELLIGENT ANIMALS")
. dropWhile (/= "I THE LAY OF THE LAND")
但你真的应该读一下Haskell(和一般的函数式编程)如何采用不同的方法来解决问题而不是命令式语言。也许Try Haskell更符合你的喜好,如果你想知道一个函数是做什么的(或正在寻找一个函数),Hoogle是不可或缺的。
答案 1 :(得分:0)
与@ mb21相似但未完全陈述,您所寻找的是drop
和take
的简单序列。
例如,在程序中定义
slice list lo hi = drop lo (take hi list)
将允许您在JavaScript和Python中使用您习惯的表单,如果需要,还可以使用中缀运算符和一对来定义它。假设我们想要将.!
用于切片运算符,并处理负面参数,如JS和Python;然后我们在顶层定义:
list .! (lo, hi) = drop l $ take h list
where
len = length list
handle_negative x | x < 0 = x + len | otherwise = x
h = handle_negative hi
l = handle_negative lo
这适用于任何有限列表;负面指数通常会搞砸潜在的无限列表:虽然这个问题可以在第二个索引中删除,但对于第一个索引来说这是必不可少的。因此,例如,为了使[0..] .! (1, -2)
切片相当于[1..]
,您通常需要保持list
和drop (-last_index) list
一起向下移动,发出元素第一个而第二个不是[]
。