2013-11-21 35 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' –

相关问题