haskell - 为清楚起见制作新类型/数据是不好的形式吗?
问题描述
我想知道做这样的事情是否是不好的形式:
data Alignment = LeftAl | CenterAl | RightAl
type Delimiter = Char
type Width = Int
setW :: Width -> Alignment -> Delimiter -> String -> String
而不是这样的:
setW :: Int -> Char -> Char -> String -> String
我确实知道有效地重新制作这些类型只会占用几行代码以换取更清晰的代码。但是,如果我将类型Delimiter
用于多个功能,那么对于导入此模块或稍后阅读代码的人来说,这会更清楚。
我对 Haskell 比较陌生,所以我不知道这种类型的东西有什么好的做法。如果这不是一个好主意,或者有一些可以提高清晰度的东西是首选的,那会是什么?
解决方案
您正在使用类型别名,它们仅对代码可读性有所帮助。但是,最好使用newtype
而不是type
为了更好的类型安全。像这样:
data Alignment = LeftAl | CenterAl | RightAl
newtype Delimiter = Delimiter { unDelimiter :: Char }
newtype Width = Width { unWidth :: Int }
setW :: Width -> Alignment -> Delimiter -> String -> String
您将处理newtype
. 但是对于进一步的重构,代码将更加健壮。本样式指南建议type
仅用于专门的多态类型。
推荐阅读
- javascript - javascript中的isset等效项以查找回文
- node.js - 如何使用订阅和 AWS AppSync 高效同步 Apollo 的缓存
- typescript - TypeScript 无法识别我的笑话模拟模块
- vuejs2 - 当值不为空时,VueJS 显示按钮
- json - Jmeter 在另一个 http 请求成功后触发 http 请求。有条件的并发请求
- php - 如何检测 PayPal 中的定期付款交易
- r - 跨数据框的计算
- android - Kotlin: Recycler View Choppy
- javascript - 我需要使用哪个 API 而不是 serializeArray 来获取字段的自定义属性?
- c - 我如何只打印出参数中以前没有出现过的字符?