【问题标题】:Can't grok a haskell type signature "instance Misty ((->) t "无法理解 haskell 类型签名“instance Misty ((->) t”
【发布时间】:2014-06-21 20:32:10
【问题描述】:

我刚读了《Learn you a haskell》,很喜欢我所看到的内容,因此开始使用该语言。我在网上找到了一些练习,我一直在努力进行类型检查。

我的问题是我不明白下面的类型签名 Misty ((->) t 中的 (->) 是什么。

class Misty m where
   banana :: (a -> m b) -> m a -> m b
   unicorn :: a -> m a

 --- what does this mean?
 instance Misty ((->) t) where
   banana = error "todo" 
   unicorn = error "todo"

谢谢!

【问题讨论】:

  • 只需将(m a) 替换为(t -> a)

标签: haskell types


【解决方案1】:

((->) t) 是一个参数类型为t 的函数,例如(->) r 的函子实例如下所示:

instance Functor ((->) r) where
    fmap = (.)

由于fmap的类型是

Functor f => (a -> b) -> f a -> f b

(.)的类型是

(a -> b) -> (r -> a) -> (r -> c)

你可以看到f是一个参数类型为r的函数。

在您的Misty 类中,这意味着bananaunicorn 的类型是:

banana :: (a -> (t -> b)) -> (t -> a) -> (t -> b)
unicorn :: (a -> (t -> a))

【讨论】:

    【解决方案2】:

    任何类型的(a -> b) 都可以重写为(->) a b

    (->) a 只是部分应用!

    所以,您实际上是要将函数((->) a) 设为Misty 的实例。

    【讨论】:

    • 那么,这个练习是否正在寻找一些东西,给定一个接受 A 并返回 Misty B 的函数,返回一个从 Misty A 到 Misty B 的函数?这是有道理的,但我很难理解在这个例子的上下文中它的含义
    • 当你无法理解时,只需为你的 typeclass 函数写出专门的类型:banana :: (a -> (t -> b)) -> (t -> a) -> (t -> b)。现在试着考虑一下,这会容易得多。
    猜你喜欢
    • 2014-04-15
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 2015-07-22
    • 2016-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多