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