[英]Haskell about recursion in list function
我正在嘗試創建一個函數(我是haskell中的新手),該函數需要兩個列表並返回一個列表。 該列表應具有第一個列表的所有元素,這些元素不在第二個列表中,所有第二個列表的元素不在第一個列表中。
因此: func [3,2,1,4] [2,5,1]
應該返回[3,4,5]
我認為我的《規范》朝着正確的方向發展,但是其中的一個大錯誤是。
func :: [Int] -> [Int] -> [Int]
func [] a = a
func a [] = a
func (x:xs) (y:ys) | elem x (y:ys) = filter (/=x) (y:ys)
| otherwise = func ys xs
假裝對這方面的問題沒有任何經驗或對base
的功能非常熟悉,我將重新編寫您的問題說明以描述我們想要的操作,並向您展示如何解決該問題:
在兩個列表上獲得
fun
的結果是:第一個列表中的所有元素不在第二個列表中,第二個列表中的所有元素不在第一個中。
要開始用代碼表示,請將“ is”替換為=
:
func l1 l2 = (elementsOfFirstNotInSecond l1 l2) ++(elementsOfFirstNotInSecond l2 l1)
現在我們需要實現elementsOfFirstNotInSecond
,所以讓我們從單詞開始:
elementsOfFirstNotInSecond
兩個名單是:如果l1
是空列表,則空單,否則,如果頭l1
(我們將其稱為“x
”)是其成員l2
則x
consed到elementsOfFirstNotInSecond
尾部的l1
和l2
。 否則(如果x
不在l2
),則只是l1
和l2
尾部的elementsOfFirstNotInSecond
看看是否可以使用尚未實現的函數將其轉換為haskell(例如,您可能要使用( isAMemberOf :: Int -> [Int] -> Bool
),然后重復該過程。
輸出順序重要嗎?
如果沒有,您可以只使用Data.List
列表差異(\\\\)
Prelude > import Data.List
Prelude Data.List> as = [3,2,1,4]
Prelude Data.List> bs = [2,5,1]
Prelude Data.List> notinSec = as \\ bs
Prelude Data.List> notinFst = bs \\ as
Prelude Data.List> ans = notinSec ++ notinFst
Prelude Data.List> ans
[3,4,5]
由於您想要遞歸並且是haskell的新手,因此解決方案(朝您的方向移動)將類似於
func (x:xs) (y:ys) | elem x (y:ys) && (not (elem y (x:xs))) = func xs (filter (/=x) (y:ys))
| (not (elem x (y:ys))) && (elem y (x:xs)) = func (filter (/=y) (x:xs)) ys
| (elem x (y:ys)) && (elem y (x:xs)) = func (filter (/=y) (xs)) (filter (/=x) (ys))
| otherwise = x : y : (func xs ys)
但是您可以看到在學習路徑的后期,這是多么的丑陋和混亂。 我建議您使用更簡單明了的替代方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.