无法理解Haskell的类型系统

时间:2012-08-21 01:52:25

标签: haskell types constructor overloading algebraic-data-types

我目前正在尝试20 Intermediate Haskell Exercises。我完成了前3个练习(但这是因为furry == fmapLearn You a Haskell已经完成了这些练习。我目前仍然坚持说:

instance Fluffy (EitherLeft t) where                                        
  furry = error "todo"

我真的不知道该怎么做。在Learn You Haskell中,他们有一个名为newtype的{​​{1}}变量,它接受一个元组。然后,他们可以进行模式匹配:

Pair

我想也许你可以在我的情况下做类似的事情:

  fmap f (Pair (x,y)) = Pair (f x, y)

但是,这不起作用:

  furry f (EitherLeft (Either a b)) = EitherLeft (Either (f a) b)

我在想也许我会Not in scope: data constructor `Either' ,因为他可能会有一些我没有的重要信息。但这没关系。

我也试图让这个工作:

import Data.Either

但这也不起作用:

  furry f (EitherLeft a b) = error "todo"

我无法让这个工作:

Constructor `EitherLeft' should have 1 argument, but has been given 2

哪个错误:

  furry f (Right x) = (Right f x)
  furry f (Left x) = Left x

我只能得到:

Couldn't match expected type `EitherLeft t a'
            with actual type `Either t0 t1'

上班。但我不知道如何处理 furry f (EitherLeft t) = error "todo"

我不一定想要答案。我只需要提示一下该做什么,因为我正在阅读,我可以解释一下,理解这些例子,但我不能真正理解我自己编写这些东西。

谢谢Dan,这就是我提出的解决方案:

t

1 个答案:

答案 0 :(得分:13)

您遇到的问题是Either数据类型没有名为Either的数据构造函数,基本上Either类型看起来像这样

data Either a b = Left a
                | Right b

因此,某个值的类型可以为Either a b,但没有类似Either "one" 1之类的值或类似值,而是Left "one"Right 1

因此,在EitherLeft的情况下,其值类似于EitherLeft (Left a)EitherLeft (Right b),并且需要进行模式匹配。