2

有没有办法干燥这个?

我不想contents : List Nav重复wrapperId : String

type alias InputModel =
    { contents : List Nav
    , containerClassName : Maybe String
    , wrapperId : String
    }


type alias Model =
    { contents : List Nav
    , containerClassName : String
    , wrapperId : String
    }


modelWithDefaults : InputModel -> Model
modelWithDefaults input =
    { input | containerClassName = withDefault "" input.containerClassName }
4

1 回答 1

2

就在这里!您可以将公共字段移动到单独的记录中,并向其中添加行变量。a然后可以稍后提供指定剩余字段的行变量:

type alias CommonModel a =
    { a
        | contents : List Nav
        , wrapperId : String
    }


type alias InputModel =
    CommonModel
        { containerClassName : Maybe String }


type alias Model =
    CommonModel
        { containerClassName : String }

您还可以使用行变量编写函数,只要它具有公共字段,它就可以接受任何记录。例如

getWrappedId : CommonModel a -> String
getWrapperId { wrapperId } = wrappedId

将同时接受InputModelModel,或任何其他至少包含由 指定的字段的记录CommonModel。将推断行变量,就像任何其他类型变量一样。

于 2018-09-30T10:19:52.563 回答