gpt4 book ai didi

haskell - 在 Haskell 中解构箭头

转载 作者:行者123 更新时间:2023-12-03 14:08:21 25 4
gpt4 key购买 nike

我是 Haskell 的新手,我一直在玩 Arrows。我想编写一个可以以编程方式“反汇编”先前构造的 Arrow 的工具。作为一个潜在的应用,想象一个函数,它接受一个箭头并返回一个有向图,代表所有的连接、拆分、扇出等。

例如, (f &&& g) >>> h 产生类似

    ----- f ----
---| |--- h -----
----- g ----

我最初认为我可以通过模式匹配来做到这一点,如下面的简单(改编自 haskell.org 箭头教程),但它不起作用。
module Main(main) where

import Control.Arrow
import Control.Category
import Prelude hiding (id, (.))

newtype SimpleFunc a b = SimpleFunc {runF :: (a -> b)}

instance Arrow SimpleFunc where
arr f = SimpleFunc f
first (SimpleFunc f) = SimpleFunc (mapFst f) where
mapFst g (a,b) = (g a, b)
second (SimpleFunc f) = SimpleFunc (mapSnd f) where
mapSnd g (a,b) = (a, g b)

instance Category SimpleFunc where
(SimpleFunc g) . (SimpleFunc f) = SimpleFunc (g . f)
id = arr id


f,g :: SimpleFunc Int Int
f = arr (\x -> x - 5)
g = arr (\x -> 3*x + 1)

h1 :: SimpleFunc Int Int
h1 = f >>> g

h2 :: SimpleFunc Int (Int, Int)
h2 = f &&& g

# It would be great if I something like this worked
is_split :: SimpleFunc a b -> Bool
is_split (a1 >>> a2) = False
is_split (a1 &&& a2) = True
....

is_split h2 -- evaluates to True
is_split h1 -- evaluates to False

我通过定义我自己的类型(即,也包括组成子类型的参数化类型)来做到这一点的所有尝试也都失败了。

构建完成后,是否有某种方法可以“拆开”箭头的组件?

最佳答案

你可以制作一个像树一样的自由箭头,这样你就可以检查它的结构。或将其降低到底层箭头。一个例子是另一个 SO 问题:Useful operations on free arrows

关于haskell - 在 Haskell 中解构箭头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27640514/

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