gpt4 book ai didi

haskell - 我怎样才能触发我的规则?

转载 作者:行者123 更新时间:2023-12-02 23:40:02 25 4
gpt4 key购买 nike

我正在为 Data.Primitive.Array 中的 fromListN 制定列表融合规则,我有点卡住了。该函数如下所示:

fromListNArray :: Int -> [a] -> Array a
fromListNArray !n l =
createArray n fromListN_too_short $ \mi ->
let go i (x:xs)
| i < n = writeArray mi i x >> go (i+1) xs
| otherwise = fromListN_too_long
go i [] = unless (i == n) fromListN_too_short
in go 0 l
{-# NOINLINE fromListNArray #-}

fromListN_too_shortfromListN_too_long 只是错误调用。

我的重写规则是

{-# RULES
"fromListNArray/foldr" [~1] forall n xs.
fromListNArray n xs = createArray n fromListN_too_short $ \mary ->
foldr (fillArray_go n mary) (fillArray_stop n) xs 0

"fillArrayN/list" [1] forall n mary xs i.
foldr (fillArray_go n mary) (fillArray_stop n) xs i = fillArrayN n mary xs i
#-}

定义助手的位置

fillArrayN :: Int -> MutableArray s a -> [a] -> Int -> ST s ()
fillArrayN !n !mary xs0 !i0 = go i0 xs0
where
go i (x:xs)
| i < n = writeArray mary i x >> go (i+1) xs
| otherwise = fromListN_too_long
go i [] = unless (i == n) fromListN_too_short
{-# NOINLINE fillArrayN #-}

fillArray_go :: Int
-> MutableArray s a
-> a
-> (Int -> ST s ())
-> Int
-> ST s ()
fillArray_go !n !mary = \x r i ->
if i < n
then writeArray mary i x >> r (i + 1)
else fromListN_too_long
{-# INLINE CONLIKE [0] fillArray_go #-}

fillArray_stop :: Int -> Int -> ST s ()
fillArray_stop !n = \i -> unless (i == n) fromListN_too_short
{-# INLINE [0] fillArray_stop #-}

第一个重写规则似乎没问题。第二条回写规则是问题所在。我似乎永远无法让它着火。有人可以提供建议吗?

<小时/>

注意:我知道我可以直接与 buildaugment 融合以避免必须回写,但这......不是一个漂亮的景象。

最佳答案

主要问题似乎是我的错误。在

"fillArrayN/list" [1] forall n mary xs i.
foldr (fillArray_go n mary) (fillArray_stop n) xs i = fillArrayN n mary xs i

foldrData.Foldable.foldr,它是一个类方法,因此不适用于规则的 LHS。解决此问题可以使回写规则在简单情况下发挥作用。

不幸的是,当 fromListNArrayaugment 融合时(通常在应用于附加列表时发生),该规则会因其他原因而无法触发。 GHC 为 fillArray_go n mary 创建了一个函数,但并不内联它。我还是不明白为什么会发生这种情况。

关于haskell - 我怎样才能触发我的规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49421179/

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