Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.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
Class Haskell中的类型类转换_Class_Haskell_Types_Type Conversion_Typeclass - Fatal编程技术网

Class Haskell中的类型类转换

Class Haskell中的类型类转换,class,haskell,types,type-conversion,typeclass,Class,Haskell,Types,Type Conversion,Typeclass,我有这个任务,我不知道从哪里开始。所以其中一件事就是做一个 可能要使用此签名进行转换: maybeEither::maybea a->any()a 另一个当然是相反的 eithermabe::要么()a->也许a 所以,当你打电话给另一个人时,他们会相互取消对方。 现在我真的不知道从哪里开始。。。有人能帮忙吗 额外问题:如何转换函数,例如(Int->a)->a和a->(Int->a) 就像在第二个例子中,你真的不能把函数作为参数给转换的函数,我不确定这将如何进行。首先,这些不是类型类,它们是数据

我有这个任务,我不知道从哪里开始。所以其中一件事就是做一个 可能要使用此签名进行转换:

maybeEither::maybea a->any()a

另一个当然是相反的

eithermabe::要么()a->也许a

所以,当你打电话给另一个人时,他们会相互取消对方。 现在我真的不知道从哪里开始。。。有人能帮忙吗

额外问题:如何转换函数,例如
(Int->a)->a
a->(Int->a)

就像在第二个例子中,你真的不能把函数作为参数给转换的函数,我不确定这将如何进行。

首先,这些不是类型类,它们是数据类型。如果您不熟悉这一差异,我建议您阅读《向您学习哈斯克尔》中的相关章节


要解决此特定问题,只需在不同构造函数上进行模式匹配:

maybeEither :: Maybe a -> Either () a
maybeEither Nothing = ???
maybeEither (Just a) = ???

您只需填写
即可



对于您的额外问题,请记住签名
a->(Int->a)
a->Int->a
相同,因为
->
是右关联的。

实际上它非常简单,只需按照类型查看您得到了什么。
maybeEither
的类型签名表明它将
可能是一个
作为输入

可能
的定义如下:

data Maybe a = Just a | Nothing
data Either a b = Left a | Right b
另外,从类型符号中,您可以得到
maybeither
a
作为函数的输出

类型构造函数的定义如下所示:

data Maybe a = Just a | Nothing
data Either a b = Left a | Right b
现在,将
a
替换为
()
,您将得到:

b=Left()| Right b

或者你可以替换你的类型变量,让它更清晰

Either () a = Left () | Right a
现在,函数的实现非常简单

maybeEither :: Maybe a -> Either () a
maybeEither (Just x) = ??? -- fill these
maybeEither Nothing = ???

您可以对其他函数采用相同的方法。

我可以建议您从替换类型变量的版本中删除
data
关键字吗?@dfeur谢谢,但我可以知道原因吗
()
只是另一种类型,它的值是
()
。我认为它不是有效的Haskell!
data
声明有一个类型构造函数,可能还有几个类型变量<代码>()
是类型构造函数,而不是类型变量。你可以用a=Left()| Right a来写等式
,但我认为没有任何方法可以直接用Haskell来表达,所以最好不要假装你是。@dfeuer谢谢,更新了。