gpt4 book ai didi

haskell - 为多个类型签名重用相同的函数体

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

我有一个像这样的函数:

test :: [Block] -> [Block]
test ((Para foobar):rest) = [Para [(foobar !! 0)]] ++ rest
test ((Plain foobar):rest) = [Plain [(foobar !! 0)]] ++ rest

Block 是一种数据类型,包括 ParaPlain 等。该函数的作用并不是特别重要,但我注意到函数体 ([Para [(foobar !! 0)]]++ rest) 对于两个 Para 来说是相同的Plain,只不过使用的构造函数是 foobar 的类型。

问题:有没有办法结合这两种情况来简洁地编写这个函数?类似的东西

test :: [Block] -> [Block]
test ((ParaOrPlain foobar):rest) = [ParaOrPlain [(foobar !! 0)]] ++ rest

其中第一个 ParaOrPlainPara foobarPlain foobar 匹配,第二个 ParaOrPlain分别为 ParaPlain

请注意,Block 也可以是(例如)BulletListOrderedList,我不想对它们进行操作。 (编辑:test x = x 对于这些其他类型。)

关键是我不想将函数体复制两次,因为它们是相同的(除非调用 ParaPlain)。

我感觉我可以使用Either,或者也许是我自己的数据类型,但我不知道该怎么做。

<小时/>

编辑澄清一下,我知道我的函数体很麻烦(我是 Haskell 的新手),并且我感谢各个回答者的简化。

但是问题的核心是,我希望避免复制 ParaPlain 行。就像(用我的虚构语言......)

# assume we have `test (x:rest)` where `x` is an arbirtrary type
if (class(x) == 'Para' or class(x) == 'Plain') {
conFun = Plain
if (class(x) == 'Para')
conFun = Para
return [conFun ...]
}
# else do nothing (ID function, test x = x)
return x:rest

即,我想知道Haskell中是否可以通过这种方式根据输入参数的类型分配构造函数。希望能澄清这个问题。

最佳答案

一种方法是使用(多态)辅助函数,例如:

helper ctor xs rest = ctor [ head xs ] : rest

test :: [Block] -> [Block]
test ((Para xs):rest) = helper Para xs rest
test ((Plain xs):rest) = helper Plain xs rest
test bs = bs

请注意,ParaPlain 只是 [whatever] -> Block 类型的函数。

关于haskell - 为多个类型签名重用相同的函数体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27007736/

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