【发布时间】:2019-11-29 08:23:30
【问题描述】:
我是 Haskell 的新手,我已经阅读了有关 Haskell 代码如何非常优雅的博客。我编写 Haskell 代码的方式看起来一点也不优雅。 我想改进的一些领域是
-
我经常在 Either 值上使用大小写匹配,正在使用类似的东西 fromRight 从 Data.Either 更好的选择?我也有一些嵌套结构的代码,用于正确的值
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”块中的命令式编程非常相似。这是 Haskell 代码的外观还是我在这里走错了路?
【问题讨论】:
-
问题是,如果我在 IO 中有一个顶级函数,我在它下编写的每个函数都需要在 IO 中,所以当我完成时,我编写的每个函数都结束了向上返回 IO/一些 Monad Trasformer 堆栈类型值。它对我有用,我只是想了解这是否是一个好习惯?
-
可以添加完整的代码吗?
-
不是很重要的事情,但
{-# LANGUAGE OverloadedStrings #-}我认为你可以跳过T.pack而直接使用URI.mkPathPiece "channel"。 -
还有类似
foo <- mapM URI.mkPathPiece $ NonEmpty.fromList [functionname, "channel", channel, "chaincode", chaincode](使用import qualified) -
“如果我在 IO 中有一个顶级函数,那么我在其下编写的每个函数都需要在 IO 中”——没有,是什么让你这么认为?相反,如果某个特定函数需要
IO而调用它的顶级函数 也需要IO。但是它调用的所有其他函数都可以是普通的纯函数,如果它们不需要IO。
标签: haskell