在haskell中拆分数组

时间:2015-12-27 18:28:33

标签: arrays haskell

我试图将一个字符串数组划分为子数组。我正在尝试以下内容;

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)一个类似的代码?

2 个答案:

答案 0 :(得分:2)

你可能在讨论列表,而不是数组,因为Haskell的Prelude和lines中没有数组返回[String],即字符串列表。

所以你想从索引n获取列表的索引m的子列表?您可以将droptake组合使用。

然而,这不是惯用的函数式编程,因为它不容易出错(例如,逐个错误)并且有更好的方法,因此不鼓励显式处理索引。因此,您似乎希望获得行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相似但未完全陈述,您所寻找的是droptake的简单序列。

例如,在程序中定义

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..],您通常需要保持listdrop (-last_index) list一起向下移动,发出元素第一个而第二个不是[]