我在下面列出了一個完整的答案,希望您可能會發現它有幫助。我同意@erisco,如果你剛剛開始,這個問題可能會有點高級。你可能想從一些問題開始,只涉及使用一個列表/關係,而不是組合兩個。 (例如,你將如何通過刪除形式×R個X?中的所有元素作出關係自反你如何產生該組的所有值的ý使得X RŸ爲固定值X ?您是否可以通過內置的Haskell函數和從頭開始解決這些問題?)
無論如何,要開始,您可能會發現它有幫助,只是從更容易閱讀的角度,使用元組來表示關係元素,所以你的兩個例子關係如下:
r1 = [(1,1),(1,2),(2,2),(2,3),(3,3),(3,4),(4,4)]
r2 = [(1,4),(1,4),(2,3),(2,3),(3,2),(3,1),(4,1)]
你想要做的是構造是一個關係,它由從r1
和r2
的任何有序對元素創建的所有複合元素組成。這是諸如此類的事情列表理解是良好的:
result = [ combine x y | x <- r1, y <- r2 ]
這個表達式創建每對x
,y
從兩個關係運行combine x y
的結果列表。 combine
應該是什麼?那麼,它有兩個元素,並生成它們的組成,所以你可能第一次嘗試這樣的:
combine (a,b) (c,d) | b == c = (a,d)
這類型檢查,但combine
只是一個局部的功能 - 它沒有價值對於那些對,不要」結合 - 所以這不會讓你太過分。您需要一種編寫combine
的方法,如果存在,則允許您返回組合,否則不返回任何內容。
的標準方式在Haskell做,這是使用Maybe
類型:
combine (a,b) (c,d) | b == c = Just (a,d)
| otherwise = Nothing
這種類型的檢查和運行,但result
值的樣子:
[Just (1,4),Just (1,4),Nothing,Nothing...]
幸運的是,有一個功能在Data.Maybe
中調用catMaybes
,這正是我們在這種情況下所需要的 - 它將全部刪除Nothing
s並將Just
值拉到一起,同時刪除文字Just
構造函數:
> catMaybes result
[(1,4),(1,4),(1,3),...]
有一些重複的應刪除,讓我們用刪除它們nub
從Data.List
:
> nub (catMaybes result)
[(1,4),(1,3),(2,3),(2,2),(2,1),(3,2),(3,1),(4,1)]
,它看起來像你可能想要的答案,但我想你錯過您的示例輸出中爲(2,3)
。
完整的程序,稍微一概而論,看起來是這樣的:
module Relations where
import Data.List
import Data.Maybe
r1 = [(1,1),(1,2),(2,2),(2,3),(3,3),(3,4),(4,4)]
r2 = [(1,4),(1,4),(2,3),(2,3),(3,2),(3,1),(4,1)]
combine (a,b) (c,d) | b == c = Just (a,d)
| otherwise = Nothing
funcComp r1 r2
= nub $ catMaybes [ combine x y | x <- r1, y <- r2 ]
result = funcComp r1 r2
如果您尚未:
- 獲得至少考慮列表內涵的習慣,在任何情況下,你'從一個或多個現有列表生成項目
- 請閱讀關鍵模塊(如
Prelude
,Data.List
和Data.Maybe
)的文檔,以便您熟悉那裏可用的功能
「。你可以用列表清楚地說明問題嗎?大概'funComp'就是你迄今爲止的內容,但不清楚你在哪裏被卡住了,看起來它開始爲長度爲1的參數做些事情。'b/= c'應該怎麼做?這是一個開始 – jberryman
我建議你先從簡單的問題開始,稍後再討論這個問題。 [https://wiki.haskell.org/Learning_Haskell](https://wiki.haskell.org/Learning_Haskell)有幾個學習資源。 – erisco