gpt4 book ai didi

haskell - 没有仿函数的应用程序

转载 作者:行者123 更新时间:2023-12-04 02:44:15 24 4
gpt4 key购买 nike

我有一个类型 Image这基本上是一个 c 数组的浮点数。创建函数很容易
map :: (Float -> Float) -> Image -> Image , 或 zipWith :: (Float -> Float -> Float) -> Image -> Image -> Image .

然而,我有一种感觉,在这些函数之上提供看起来像应用实例的东西也是可能的,允许更灵活的像素级操作,如 ((+) <$> image1 <*> image2)((\x y z -> (x+y)/z) <$> i1 <*> i2 <*> i3) .然而,天真的方法失败了,因为 Image 类型不能包含浮点以外的东西,因此无法实现 fmap像这样。

这怎么可能实现?

最佳答案

阅读评论,我有点担心这里的尺寸在地毯下。尺寸不匹配时是否有明智的行为?

同时,您可以按照以下思路明智地做一些事情。即使你的数组​​不容易做多态,你也可以做一个 Applicative像这样的例子。

data ArrayLike x = MkAL {sizeOf :: Int, eltOf :: Int -> x}

instance Applicative ArrayLike where
pure x = MkAL maxBound (pure x)
MkAL i f <*> MkAL j g = MkAL (min i j) (f <*> g)

(爱好者会注意到,我将 (Int ->) 应用程序的乘积与 ( maxBound , min ) 半群诱导的应用程序相结合。)

你能做一个干净的通信吗
imAL :: Image -> ArrayLike Float
alIm :: ArrayLike Float -> Image

通过投影和制表?如果是这样,您可以编写这样的代码。
alIm $ (f <$> imAL a1 <*> ... <*> imAL an)

此外,如果您想将该模式包装为重载运算符,
imapp :: (Float -> ... -> Float) -> (Image -> ... -> Image)

这是类型类编程的标准练习! (询问您是否需要更多提示。)

但是,关键点是包装策略意味着您无需为了将功能性上层结构放在顶部而对数组结构进行猴子。

关于haskell - 没有仿函数的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7024788/

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