Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 我可以将函数限制为数据类型中的特定构造函数吗?_Haskell - Fatal编程技术网

Haskell 我可以将函数限制为数据类型中的特定构造函数吗?

Haskell 我可以将函数限制为数据类型中的特定构造函数吗?,haskell,Haskell,假设我有这样一个函数: myFunction::可能是a->b 但是用Nothing来调用它没有任何意义--只是一个是唯一有意义的值。是否可以在myFunction的类型定义中表示此约束 我知道我总能做到以下几点,但对我来说,这似乎不是很干净: myFunction Nothing=未定义 但是,把它称为“零”是没有任何意义的——只有a是唯一有意义的价值观 这意味着您正在查找myFunction::a->b 顺便说一句,那个些只能将一组特定类型值映射到其他类型值的函数并不是完整的。如果您使用

假设我有这样一个函数:

myFunction::可能是a->b
但是用
Nothing
来调用它没有任何意义--
只是一个
是唯一有意义的值。是否可以在
myFunction
的类型定义中表示此约束

我知道我总能做到以下几点,但对我来说,这似乎不是很干净:

myFunction Nothing=未定义
但是,把它称为“零”是没有任何意义的——只有a是唯一有意义的价值观

这意味着您正在查找
myFunction::a->b

顺便说一句,那个些只能将一组特定类型值映射到其他类型值的函数并不是完整的。如果您使用它们,您总是有可能最终得到一个未定义的
。在这种特殊情况下,它看起来像是多余的缺乏纯度

此外,还有一个分部函数可以将
可能是一个
转换为
一个
,并为
引发异常。和
myFunction。fromJust
::可能是a->b

但是,把它称为“零”是没有任何意义的——只有a是唯一有意义的价值观

这意味着您正在查找
myFunction::a->b

顺便说一句,那个些只能将一组特定类型值映射到其他类型值的函数并不是完整的。如果您使用它们,您总是有可能最终得到一个未定义的
。在这种特殊情况下,它看起来像是多余的缺乏纯度


此外,还有一个分部函数可以将
可能是一个
转换为
一个
,并为
引发异常。和
myFunction。fromJust
is
::也许a->b

谢谢你的回复。然而,我想我选择了一个非常糟糕的例子:我遇到的实际问题不是“可能”,而是一个自定义数据类型。我将重新措辞这个问题。为此道歉!因此,您希望有一个类似于
myFunction::Just a->b
的函数,并在编译时检查它是否仅用于
Just
值?不要认为在当前的大学里这是可能的,使用
fmap
而不是
fromJust
fmap(myFunction::a->b)::也许a->也许b
@GabrielGonzalez是的,
fromJust
这里只是为了满足所要求的
:也许a->b
签名,这显然是不安全的,谢谢你的回复。然而,我想我选择了一个非常糟糕的例子:我遇到的实际问题不是“可能”,而是一个自定义数据类型。我将重新措辞这个问题。为此道歉!因此,您希望有一个类似于
myFunction::Just a->b
的函数,并在编译时检查它是否仅用于
Just
值?不要认为这在当前的宇宙中是可能的使用
fmap
而不是从just
fmap(myFunction::a->b)::也许a->也许b
@GabrielGonzalez是的,
fromJust
这里只是为了满足所请求的
::也许a->b
签名显然是未经验证的,而不是编辑问题来完全改变它的意义,你应该接受你已经收到的原始问题的限定答案,并在新的线程中询问另一个问题。请这样做。您将在编辑历史记录中找到更新的问题。在此期间,我将其回滚。与其编辑问题以完全改变其意义,您应该接受您已经收到的原始问题的限定答案,并在新的线程中询问另一个问题。请这样做。您将在编辑历史记录中找到更新的问题。在此期间,我已将其回滚。