gpt4 book ai didi

haskell - 仿函数的实例

转载 作者:行者123 更新时间:2023-12-05 00:15:59 26 4
gpt4 key购买 nike

我有以下类型 newtype Arr2 e1 e2 a = Arr2 { getArr2 :: e1 -> e2 -> a } .
我必须为它编写 Functor 实例,但我真的不明白如何
我试过

instance Functor (Arr2 e1 e2) where
fmap g (Arr2 a) = Arr2 (g a)


instance Functor (Arr2 e1 e2) where
fmap g = g . getArr2

这实际上导致类型
(a -> b) -> Arr2 e1 e2 a -> b

而不是想要
(a -> b) -> Arr2 e1 e2 a -> Arr2 e1 e2 b

所以请帮帮我

最佳答案

Functor 类具有定义:

class Functor f where:
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f a
(<$)有一个默认实现: (<$) = fmap . const这工作正常。

所以这意味着如果我们输入一个函数( g :: a -> b )作为第一个参数,然后输入一个 Arr2产生 a ,我们必须生成一个 Arr2这叫 g如果应用了箭头的结果。

结果 fmap的定义为您 Arr2是:
instance Functor (Arr2 e1 e2) where
fmap g (Arr2 a) = Arr2 (\x y -> g (a x y))

或者更优雅:
instance Functor (Arr2 e1 e2) where
fmap g (Arr2 a) = Arr2 (\x -> g . (a x))

或者更优雅的版本 - 评论人 @Alec :
instance Functor (Arr2 e1 e2) where
fmap g (Arr2 a) = Arr2 ((g .) . a)

(您可以使用 this tool 将表达式转换为无点表达式)

关于haskell - 仿函数的实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43178458/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com