我正在进行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?
谢谢你的帮助。 :)
答案 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