首页 > 解决方案 > 为清楚起见制作新类型/数据是不好的形式吗?

问题描述

我想知道做这样的事情是否是不好的形式:

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 比较陌生,所以我不知道这种类型的东西有什么好的做法。如果这不是一个好主意,或者有一些可以提高清晰度的东西是首选的,那会是什么?

标签: haskelltype-safetytype-aliasnewtype

解决方案


您正在使用类型别名,它们仅对代码可读性有所帮助。但是,最好使用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仅用于专门的多态类型。


推荐阅读