【问题标题】:Typeclass conversion in Haskell [duplicate]Haskell中的类型类转换[重复]
【发布时间】:2014-08-17 21:40:00
【问题描述】:

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

maybeEither:: Maybe a -> Either () a

另一个当然是相反的

eitherMaybe:: Either () a -> Maybe a

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

额外问题:我将如何转换函数,例如 (Int->a) -> aa -> (Int->a) 就像在第二个示例中,您真的不能将函数作为参数提供给转换的函数,我不知道会怎样。

【问题讨论】:

    标签: class haskell types type-conversion typeclass


    【解决方案1】:

    首先,这些不是类型类,它们是数据类型。如果您不熟悉其中的区别,我建议您阅读 Learn You a Haskell 中的相关章节。


    要解决这个特殊问题,您只需要在不同的构造函数上进行模式匹配:

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

    eitherMaybe :: Either () a -> Maybe a
    eitherMaybe (Left x) = ???
    eitherMaybe (Right y) = ???
    

    您只需填写???s 即可。


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

    【讨论】:

      【解决方案2】:

      其实很简单,按照类型来看看你会得到什么。 maybeEither 的类型签名表明它将Maybe a 作为输入。

      Maybe 是这样定义的:

      data Maybe a = Just a | Nothing
      

      此外,从类型签名中,您可以得到 maybeEitherEither () a 作为函数的输出。

      Either 类型构造函数定义如下:

      data Either a b = Left a | Right b
      

      现在,将a 替换为(),您将得到:

      Either () b = Left () | Right b

      或者您可以替换您的类型变量以使其清晰,

      Either () a = Left () | Right a
      

      现在,函数的实现非常简单。

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

      您可以对其他功能采用相同的方法。

      【讨论】:

      • 我可以建议您从您替换类型变量的版本中删除 data 关键字吗?
      • @dfeuer 谢谢,但我能知道为什么吗? () 只是另一种以 () 为值的类型。
      • 我认为它不是有效的 Haskell! data 声明有一个类型构造函数,可能还有几个类型变量。 () 是类型构造函数,而不是类型变量。你可以写出等式Either () a = Left () | Right a,但我认为在Haskell中没有任何方法可以直接表达,所以最好不要假装你是。
      • @dfeuer 谢谢,已更新。
      猜你喜欢
      • 2014-01-07
      • 1970-01-01
      • 2011-08-15
      • 2016-10-23
      • 2010-12-29
      • 1970-01-01
      • 2019-05-01
      • 1970-01-01
      • 2016-05-22
      相关资源
      最近更新 更多