簡體   English   中英

一種函數,它基於索引的第一列表從第二列表中獲取相應的元素

[英]A function that it takes corresponding elements from the second list based on the first lists of indexes

對於我的編程課,我需要與此分配的問題相關的幫助。

您需要實現一個函數subList,以便它根據索引的第一個列表從第二個列表中獲取相應的元素。

例如,如果輸入是subList [0,3,4] [1,2,3,4,5,6,7,8] ,則答案應為[1,4,5]

subList :: [Int] -> [Int] -> [Int]
subList lst1 lst2

我對編程總體來說還是一個新手,所以這就是我到目前為止所擁有的全部...

如果兩個列表中都沒有類似的元素,我還需要一個錯誤函數。 例如,輸入= [0,9][1,2,3] ,輸出應等於自定義錯誤字符串...例如,“輸入索引超出范圍”

您可以使用列表理解:

Prelude> let subList lst1 lst2 = [x | (i, x) <- zip [0..] lst2, i `elem` lst1]
Prelude> subList [0,3,4] [1,2,3,4,5,6,7,8]
[1,4,5]

讓我們分析一下代碼。 我們希望所有索引x存在於第二個列表lst2其索引i存在於另一個列表lst1

在理解中,我們有以下三個主要方面:

  • 之前| 是我們將為每個“迭代”捕獲的值(我們想要x ,這將是lst2存在的值)
  • 第二個塊是我們聲明將從哪里獲取值。
    • 在這種情況下,我們需要這些值及其索引。 使用此zip [0..] lst2我們建立了一個元組列表,其中元組的第一個值是索引,第二個值是從lst2獲取的值(類似[(0, 1), (1, 2)...] )。
    • 然后我們一個接一個地取它們,並用(i, x) <- ...對那些元組進行模式匹配(i, x) <- ...其中i將是每個索引,而x每個值都將在前面說明。
  • 最后的塊, i elem lst1調用從ELEM功能Data.List一個值是否存在於列表至極檢查。 該第三塊期望一個布爾值,並且對於每個從取值表達式中獲取的值,對另一個塊進行一次評估。 在這種情況下,僅當lst1中存在值i (我們的索引)時,它將評估為True

這是一個非常簡單的解決方案。 為了不完全破壞您的作業,自定義錯誤部分留給讀者練習。

subList lst1 lst2 = map (lst2 !!) lst1

map將函數應用於列表的所有元素,並在新列表中返回結果,然后!! 從列表中獲取給定索引的元素。

暫無
暫無

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

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