2013-12-18 41 views

回答

1
other :: Eq a => a -> (a, a) -> a 
other x (y,z) | x == y = z | x == z = y | otherwise = error "undefined" 

你可以做這樣的事情。請注意,如果字符存在於元組值範圍之外,會發生什麼?

test1 = other 'D' ('D','W') -- * W 
test2 = other 'W' ('D','W') -- * D 
test3 = other 'X' ('D','W') -- * error... 

Per @ RottenBrain的建議。 monod可以用來處理故障情況。

other :: Eq a => a -> (a, a) -> Maybe a 
other x (y,z) | x == y = Just z | x == z = Just y | otherwise = Nothing 
+0

我認爲他知道如何編寫功能,只是想知道,如果它已經Haskell的庫的一部分。此外,在這種情況下,「未定義」會比「錯誤」更好。 –

+2

@保羅曼塔 'undefined'是的'error' ... '未定義=錯誤定義的 「前奏;未定義」' –

+0

@The互聯網謝謝:)。 – user3094936

7

「Haskell中是否有函數說....」?

通過使用Hoogle,您可以對任何此類問題的答案有個很好的主意。 Haskell的美妙之處在於,這種類型通常實際上限制了您提出的功能,而Hoogle則是讓您獲得非常全面的答案的工具。

在這種情況下,我們得到一個元組,並且想要得到元組中的一個值作爲結果。

(a, b)->a->b or (a, b)->b->a 

但是等等! Haskell不能從同一個函數輸出兩種不同的類型,所以給出了一個隱含的約束 - a必須與b相同。現在的類型是:

(a, a)->a->a 

(這更加縮小功能搜索空間,使得Hoogle更加有用)。

再次等待......我們忘記了一些東西。 a需要有一個(==)操作,以類型做了測試....大,甚至進一步收窄:

Eq a=>(a, a)->a->a 

現在,我們可以輸入到這個Hoogle,看看....幾乎沒有有用。

這是失敗嗎?一點也不! Hoogle非常全面,在我之前的經驗中,如果它不存在,它可能不是標準功能,所以請自己寫。

(這並不奇怪,我認爲這個功能不是標準....元組很少用來繞過相同類型的項目的泛型列表,那就是更多的列表-Y的東西)

+0

很好的答案:)我將它發送給每一個「有沒有在Haskell的函數......」?題 :) – d12frosted

相關問題