gpt4 book ai didi

haskell - Haskell 中案例的较短语法?

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

说我有这样的傻事:

data SomeType
= Unary Int
| Associative SomeType
| Binary SomeType SomeType

some_func :: SomeType -> Int
some_func s =
case s of
Unary n -> n
Associative s1 -> some_func s1
Binary s1 s2 -> some_func s1 + some_func s2

这里 some_func 将查看给定 SomeType 中的所有 SomeType 并总结所有 Unary 数据构造函数的 Int。 SomeType 是一种递归数据类型。

在这些模式匹配中,我重复了 some_func s1 .有没有办法使用@、when、let 或其他任何东西来声明 sf1 = some_func s1并在两者中使用它?像这样的东西:
data SomeType
= Unary Int
| Associative SomeType
| Binary SomeType SomeType

some_func :: SomeType -> Int
some_func s =
case s of
Unary n -> n
Associative s1 -> sf1
Binary s1 s2 -> sf1 + sf2
where
sf1 = some_func s1
sf2 = some_func s2

这里的问题是 s1 和 s2 只在 -> 之后的块中是已知的。并且无法计算 sf1。

最佳答案

这不能回答问题,但可能会解决问题:

{-# LANGUAGE DeriveFoldable #-}
module SomeType where
import Data.Foldable as F

data SomeType a
= Unary a
| Associative (SomeType a)
| Binary (SomeType a) (SomeType a)
deriving (Foldable)

some_func :: SomeType Int -> Int
some_func = F.foldl1 (+)

关于haskell - Haskell 中案例的较短语法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10256937/

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