比方说,我有这样的函数:我可以将函数限制在数据类型中的特定构造函数吗?
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' –
不要编辑问题来彻底改变它的意义,你应该已经接受了你已经收到的原始问题的合格答案,并在新的线程中询问另一个答案。请好好做。你会在编辑历史中找到你更新的问题。在此期间,我已经把它推回去了。 –