2013-11-21 32 views
0

比方說,我有這樣的函數:我可以將函數限制在數據類型中的特定構造函數嗎?

myFunction :: Maybe a -> b 

但它沒有任何意義,與Nothing稱之爲 - Just a是唯一的一種有意義的值。是否有可能在myFunction的類型定義中表示這個約束?

我知道,我總是可以做到以下幾點,但它似乎並不十分乾淨對我說:

myFunction Nothing = undefined 
+2

不要編輯問題來徹底改變它的意義,你應該已經接受了你已經收到的原始問題的合格答案,並在新的線程中詢問另一個答案。請好好做。你會在編輯歷史中找到你更新的問題。在此期間,我已經把它推回去了。 –

回答

5

但它沒有任何意義沒什麼可稱之爲 - 只是一個是唯一一種有意義的價值

這意味着你在尋找myFunction :: a -> b

順便說一句,只能將特定的一組類型值映射到其他東西的函數並不是全部。如果你使用它們,你總會冒險以undefined結尾。在這種特殊情況下,它看起來像缺乏純度。

此外,還有一個部分功能fromJust可能會將Maybe a轉換爲a並引發Nothing的例外。而myFunction . fromJust:: Maybe a -> b

+0

感謝您的回覆。但是,我認爲我選擇了一個非常糟糕的例子:我遇到的實際問題不是「可能」,而是自定義數據類型。我會重申這個問題。爲此道歉! – Gustavo

+0

所以你想有一個像'myFunction :: Just a - > b'這樣的函數,並且在編譯時檢查它是否僅僅以'Just'的值被使用?不要認爲它在當前的宇宙中是可能的 –

+0

使用'fmap'而不是'fromJust':'fmap(myFunction :: a - > b):: Maybe a - > Maybe b' –

相關問題