gpt4 book ai didi

haskell - 如何让 Haskell 中的代码看起来优雅?

转载 作者:行者123 更新时间:2023-12-02 14:32:20 24 4
gpt4 key购买 nike

我是 Haskell 新手,我读过关于 Haskell 代码如何非常优雅的博客。我编写 Haskell 代码的方式,看起来一点也不优雅。我想要改进的一些领域是

  • 我经常在任一值上使用大小写匹配,正在使用类似的东西fromRight from Data。有更好的选择吗?我还有一些带有嵌套结构的代码,用于正确的值

    case eitherResponse of
    Right response -> return $ toJSON $ response
    Left msg -> Log $ "Error" <> msg
  • 我有很多类似这样的代码

    fname <- URI.mkPathPiece functionname
    kch <- URI.mkPathPiece $ T.pack "channel"
    vch <- URI.mkPathPiece channel
    kca <- URI.mkPathPiece $ T.pack "chaincode"
    vca <- URI.mkPathPiece chaincode
    let path = Just (True, Data.List.NonEmpty.fromList [fname, kch, vch, kca, vca])

我真的不喜欢它的外观,我该如何改进?

此外,Haskell 对我来说与“do” block 中的命令式编程非常相似。 Haskell 代码应该是这样的还是我走错了路?

最佳答案

您可以像这样改进第二个示例:

pieces <- traverse URI.makePathPiece $ 
NonEmpty.fromList [functionName, "channel", channel, "chaincode", chaincode]
let path = Just (True, pieces)

我们通过使用 {-# OverloadedStrings #-} 扩展来省略 T.pack。然后使用traverse将monadic函数映射到NonEmpty,这是一个可遍历的容器。

我需要更多上下文来给出第一个示例的具体替代方案,但如果您有嵌套结构,例如:

case eitherResponse of
Left -> some error ...
Right x ->
case someFunction x of
Left -> some error ...
Right y -> ...

这种链接正是 Either/ExceptTMonad 实例所做的。你可以让它看起来像这样:

do x <- eitherResponse
y <- someFunction x

是时候了解 monad 转换器了!

关于haskell - 如何让 Haskell 中的代码看起来优雅?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57127726/

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