20次中间运动训练 - 练习9

时间:2017-10-22 12:17:31

标签: haskell

我正在进行20次中间运动训练。练习9是:

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

提供的解决方案here

instance Misty ((->) t) where
    banana x y z = (x $ y z) z
    unicorn f _ = f

如果我用香蕉的签名中的(( - >)t)替换m,我得

(a -> (t->b)) -> (t->a) -> (t->b)

它似乎是(( - >)t)的约束函数。那为什么香蕉需要三个论点呢?为什么答案是(x $ y z)z?

谢谢你的帮助。 :)

1 个答案:

答案 0 :(得分:2)

关键的洞察力是签名

(a -> (t->b)) -> (t->a) -> (t->b)

相当于:

(a -> (t->b)) -> (t->a) -> t -> b

这意味着绑定banana x y z绑定以下内容:

x :: a -> (t->b)
y :: t -> a
z :: t

因此:

y z :: a
x $ y z :: t -> b
(x $ y z) z :: b