【问题标题】:Type signature as function类型签名作为函数
【发布时间】:2017-10-22 04:51:27
【问题描述】:

我有以下类型构造函数和数据构造函数:

data Compose f g x = MkCompose (f (g x))

在Compose的前奏中获取类型签名,它显示:

MkCompose :: f (g x) -> Compose f g x

为什么它显示为一个函数?

当我应用以下类型时:

*ComposeExercise> :t MkCompose [[42]]
MkCompose [[42]] :: Num x => Compose [] [] x

那么对我来说,这很清楚。

【问题讨论】:

  • 因为这是最通用的签名。请注意MkCompose 是一个构造函数。在您的第二个示例中,参数已填写。
  • 这里到底有什么问题? MkCompose 是一个构造函数,根据定义它是一个函数。究竟有什么不清楚的地方?
  • 啊哈。我太傻了。不清楚为什么它显示为函数f (g x) -> Compose f g x
  • 您希望MkCompose 拥有什么类型?

标签: haskell


【解决方案1】:

当你写作时:

data Compose f g x = MkCompose (f (g x))

你是说:

MkCompose :: f (g x) -> Compose f g x

那是Compose的定义;这就是 data 声明的作用。

但是,当你给它一个参数时(因为它是一个函数),如下所示,fgx 被赋予特定类型:

λ> :t MkCompose [[1]]                    -- f = [], g = [], x = Num n => n.
MkCompose 1 :: Num n => Compose [] [] n  -- As in the definition.

MkCompose 有一个函数类型正是因为它是一个函数;它接受一个值并返回另一个值。

如果不清楚,这里有一些其他示例:

  • MkCompose (Just [1]) :: Num n => Compose Maybe [] n,因为Just [1] :: Num n => Maybe [n]。在这种情况下,f = Maybeg = []x = Num n => n
  • MkCompose getLine :: Compose IO [] Char,因为getLine :: IO [Char]。在这种情况下,f = IOg = []x = Char
  • MkCompose [[]] :: Compose [] [] x,因为[[]] :: [[x]]。在这种情况下,f = []g = [],但x 可以是任何东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-03
    • 1970-01-01
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多