比方說,我有這樣的函數:我可以將函數限制在數據類型中的特定構造函數嗎?
myFunction :: Maybe a -> b
但它沒有任何意義,與Nothing
稱之爲 - Just a
是唯一的一種有意義的值。是否有可能在myFunction
的類型定義中表示這個約束?
我知道,我總是可以做到以下幾點,但它似乎並不十分乾淨對我說:
myFunction Nothing = undefined
比方說,我有這樣的函數:我可以將函數限制在數據類型中的特定構造函數嗎?
myFunction :: Maybe a -> b
但它沒有任何意義,與Nothing
稱之爲 - Just a
是唯一的一種有意義的值。是否有可能在myFunction
的類型定義中表示這個約束?
我知道,我總是可以做到以下幾點,但它似乎並不十分乾淨對我說:
myFunction Nothing = undefined
但它沒有任何意義沒什麼可稱之爲 - 只是一個是唯一一種有意義的價值
這意味着你在尋找myFunction :: a -> b
。
順便說一句,只能將特定的一組類型值映射到其他東西的函數並不是全部。如果你使用它們,你總會冒險以undefined
結尾。在這種特殊情況下,它看起來像缺乏純度。
此外,還有一個部分功能fromJust
可能會將Maybe a
轉換爲a
並引發Nothing
的例外。而myFunction . fromJust
是:: Maybe a -> b
。
感謝您的回覆。但是,我認爲我選擇了一個非常糟糕的例子:我遇到的實際問題不是「可能」,而是自定義數據類型。我會重申這個問題。爲此道歉! – Gustavo
所以你想有一個像'myFunction :: Just a - > b'這樣的函數,並且在編譯時檢查它是否僅僅以'Just'的值被使用?不要認爲它在當前的宇宙中是可能的 –
使用'fmap'而不是'fromJust':'fmap(myFunction :: a - > b):: Maybe a - > Maybe b' –
不要編輯問題來徹底改變它的意義,你應該已經接受了你已經收到的原始問題的合格答案,並在新的線程中詢問另一個答案。請好好做。你會在編輯歷史中找到你更新的問題。在此期間,我已經把它推回去了。 –