簡體   English   中英

返回列表一部分的函數

[英]Function to return a part of a list

我是Haskell的新手,正在做作業。 我必須寫一個

Int-> Int-> [u]-> [u]

給定的函數輸入兩個Int i和j以及一個列表,並返回位置大於i且小於j的元素。 到目前為止,我想到的是:

fromTo :: Int->Int->[u]->[u]
fromTo i j (h:t) 
    |i == 1 && j == length(h:t)
        = (h:t)
|i /= 1
    fromTo (i-1) j t
|j /= length(h:t)
    fromTo i j init(h:t)

但是我收到第二個|的語法錯誤。 也不確定我的思路在這里是否正確。 (init返回不包含最后一個元素的列表)

編輯:更正

|i /= 1
    fromTo (i-1) j (h:t)

|i /= 1
    fromTo (i-1) j t

固定縮進,括號和缺少= s。 此重新編譯可用於普通和有限非空列表,並適用於:

fromTo :: Int -> Int -> [u] -> [u]
fromTo i j (h : t)
   | i == 1 && j == length (h : t) = h : t
   | i /= 1                        = fromTo (i - 1) j t
   | j /= length (h : t)           = fromTo i j (init (h : t))

我認為您正在尋找類似這種無點自然索引span

take :: Int -> [a] -> [a]
take _ []       = []
take 0 _        = []
take n (x : xs) = x : take (n - 1) xs

drop :: Int -> [a] -> [a]
drop _ []       = []
drop 0 xs       = xs
drop n (_ : xs) = drop (n - 1) xs

span :: Int -> Int -> [a] -> [a]
span i j  =  drop i . take (j + 1)

哪一個

span 0 3 [0 .. 10]  ==  [0,1,2,3]

或者,為了符合規范:

between :: Int -> Int -> [a] -> [a]
between i j  =  drop (i + 1) . take j

哪一個

between 0 3 [0 .. 10]  ==  [1,2]

你錯過=之間| 保護條款和主體。 Haskell編譯器認為整個事情都是守衛者,當遇到下一個|時,會感到困惑| 警惕,因為它首先要有身體。 這將編譯(盡管它仍然是錯誤的):

fromTo :: Int -> Int -> [u] -> [u]
fromTo i j (h:t) 
  | i == 1 && j == length (h:t) =
    (h:t)
  | i /= 1 =
    fromTo (i-1) j t
  | j /= length (h:t) =
    fromTo i j (init (h:t))

但我想說有更好的編寫此函數的方法。 例如,原則上,像這樣的函數應該在無限列表上工作,但是使用length使得這不可能。

這是使用遞歸的完整解決方案:

fromTo :: Int -> Int -> [u] -> [u]
fromTo i j xs = go i j xs []
    where go i j (x:xs) rs
        | i < 0 || j < 0 = []
        | i > length (x:xs) || j > length (x:xs) = []
        | i /= 0                        = go (i - 1) j t
        | j /= 1           = goo i (j -1) (rs ++ [x])
        | otherwise = rs

注意: go是遞歸函數的標准Haskell慣用法,與主函數相比,它需要額外的參數。 第一個子句確保負索引導致空列表。 對於超過列表大小的任何索引,第二個都執行相同的操作。 列表必須是有限的 所述陣列的第三“忘記”頭i倍。 第四將累積“下一個” (j - 1)頭進入rs 當所有索引都被“花費”並且rs包含結果時,將觸發第五子句。

您可以使其在無限列表上工作。 刪除第二個子句。 如果xs在“窮盡”索引之前為空,則返回rs 然后,函數將從i獲取“最多” (j-1)元素。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM