gpt4 book ai didi

haskell - 如何为包含函数的新类型构建 fmap

转载 作者:行者123 更新时间:2023-12-04 18:00:29 25 4
gpt4 key购买 nike

所以假设我想定义一个包含函数的新类型:

newtype Test m a = Test(m -> (a, m))

这可以用来容纳某种状态。

现在假设我想为这个新类型实现 fmap。
instance Functor (Test m) where
--fmap :: (a -> b) -> Test m a -> Test m a -> b
fmap f (Test f1) (Test f2) = ?

由于新类型的房屋功能没有办法使用模式匹配来分开 f1 和 f2。

例如,我最初认为也许我可以将 f2 的输入值传递给调用 f1 以产生一个 (a, m) 元组,但我认为你不能这样做。
IE
tup = f1 (get input of f2)

有没有人能够向我提供我在处理这种情况时缺少的概念,或者这是不可能的?

谢谢

更新

非常感谢 Redu 和 Willem Van Onsem。

看起来我对如何使用组合运算符 (.) 缺乏了解。

基本上这里的关键是使用 (.) 来获取元组的第一个元素,然后执行一堆部分函数定义以进入 fmap 所需的状态。这是我没有使用库函数的 fmap 实现。故意冗长以帮助理解。
alterParamStateHelper :: (a -> b) -> (m -> a) -> m -> (b, m)
alterParamStateHelper f1 f2 m = (b, m)
where
a = f2 e
b = f1 a

alterParamState :: (a -> b) -> (m -> (a, m)) -> (m -> (b, m))
alterParamState f1 f2 = alterParamStateHelper f1 h1
where
h1 = fst . f2--m -> a

instance Functor (Test m) where
-- fmap :: (a -> b) -> Test m a -> Test m b
fmap f1 (Test f2) = Test (alterParamState f1 f2)

最佳答案

Since the newtype houses functions there's no way to use pattern matching to break f1 and f2 apart.



您的 fmap 有问题在这里签名。 fmap有签名 fmap :: Functor f => (a -> b) -> f a -> f b 所以如果 f ~ Test m ,则签名为 fmap :: (a -> b) -> Test m a -> Test m b .

因此我们可以在这里定义一个 fmap我们对函数的结果进行“后处理”。因此,我们构造了一个新函数,它将使用旧函数来构造一个 2 元组 (a, m) ,然后调用 f在第一项上,这样我们就构造了一个元组 (b, m) :
import Control.Arrow(first)

instance Functor (Test m) where
fmap f (Test g) = Test (first f . g)

关于haskell - 如何为包含函数的新类型构建 fmap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58595972/

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