如何将两个函数重构为一个采用泛型参数的函数?

时间:2017-06-05 12:06:22

标签: elm

如何将两个函数重构为一个具有泛型参数的函数?

示例:

getVideo : Video -> Post
getVideo video =
    let
        (Video post) =
            video
    in
        post


getPodcast : Podcast -> Post
getPodcast podcast =
    let
        (Podcast post) =
            podcast
    in
        post

我想做类似的事情:

getPodcast : 'a -> Post
getPodcast 'a =
    let
        ('a post) =
            'a
    in
        post

附录

type Video
    = Video Post

type Podcast
    = Podcast Post

1 个答案:

答案 0 :(得分:6)

你不能在Elm中拥有这样的开放式通用函数。这有两个选择:

  1. 使用容器类型
  2. 您可以创建一个容器类型,其中包含每个有效类型的构造函数:

    getPost

    现在,您的case函数包含一个getPost : PostContainer -> Post getPost container = case container of VideoContainer (Video post) -> post PodcastContainer (Podcast post) -> post 语句,该语句将返回相应的帖子。

    Post
    1. Post
    2. 中包含帖子类型

      假设您的type alias Post = { name : String , body : String } 对象如下所示:

      type PostType = Video | Podcast
      

      你可以像这样创建一个帖子类型的枚举:

      Post

      您可以重新定义type alias Post = { name : String , body : String , postType : PostType } 以包含类型:

      type alias PostContents =
          { name : String
          , body : String
          }
      
      type Post = Post PostType PostContents
      

      或者,如果您选择将帖子主体与类型分开,您可以执行以下操作:

      getPostContents

      ,您的getPostContents : Post -> PostContents getPostContents _ contents = contents 功能只是

      value