Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 这是类型声明吗?_Haskell - Fatal编程技术网

Haskell 这是类型声明吗?

Haskell 这是类型声明吗?,haskell,Haskell,哈斯克尔是个新手。我在网上关注这本生成性艺术教程,发现了下面的代码片段。我运行了它,它运行得很好。问题是我一点都不懂 type Generate a = RandT StdGen (ReaderT World Render) a 是产品类型声明吗?如果是,那么是否可以像上面那样在括号中组合一组类型?在我看来,它更像是一个在类型或类似类型中定义的函数。我认为不清楚如何解析它,所以让我们将其分解 type Generate a = RandT StdGen (ReaderT Wor

哈斯克尔是个新手。我在网上关注这本生成性艺术教程,发现了下面的代码片段。我运行了它,它运行得很好。问题是我一点都不懂

type Generate a = RandT StdGen (ReaderT World Render) a

是产品类型声明吗?如果是,那么是否可以像上面那样在括号中组合一组类型?在我看来,它更像是一个在类型或类似类型中定义的函数。

我认为不清楚如何解析它,所以让我们将其分解

type
Generate a
=
RandT
  StdGen
  (ReaderT
    World
    Render)
  a
让我们把它分解一下。第1行是
type
这意味着“我在这里定义一个类型别名”。类型别名是另一个类型的简写,与扩展到的类型完全相同。请注意,
data
表示“我正在定义一个新的数据类型,这就是如何构造它的值”

第2行表示“该类型将被称为
Generate
,是一个has参数
a
”,即
Generate
是某个类型级别的函数(在这种情况下,类型例如
Int
可能Int
,而不是
可能

第4行表示该类型等于类型构造函数的某个应用程序
RandT
。这个东西有种
*->(*->*)->*->*->*
,它的意思大致是:

  • 第一个参数是随机数生成器的类型
  • 第二个参数是一些单子
  • 返回一个Monad(即第三个参数是Monad中的类型,结果是Monad)
  • 让我们看看第二个论点。这是
    ReaderT
    的一个应用程序,一种类型级别的东西
    *->(*->*)->*->*->*
    。第一个论点是你想读的东西(世界的状态)。第二个是你想要建立的单子。在本例中,
    渲染
    ,我假设让您边走边构建艺术。没有第三种,所以就像在普通的哈斯凯尔(Haskell)中使用咖喱一样,这种咖喱的结果是
    *->*
    ,这是
    RandT
    想要的那种


    阅读的方法是:
    Generate
    是一个单子,可以使用随机数生成(使用标准生成器),读取类型为
    World
    的值,然后渲染艺术。

    我认为不清楚如何解析它,所以让我们将其分解

    type
    Generate a
    =
    RandT
      StdGen
      (ReaderT
        World
        Render)
      a
    
    让我们把它分解一下。第1行是
    type
    这意味着“我在这里定义一个类型别名”。类型别名是另一个类型的简写,与扩展到的类型完全相同。请注意,
    data
    表示“我正在定义一个新的数据类型,这就是如何构造它的值”

    第2行表示“该类型将被称为
    Generate
    ,是一个has参数
    a
    ”,即
    Generate
    是某个类型级别的函数(在这种情况下,类型例如
    Int
    可能Int
    ,而不是
    可能

    第4行表示该类型等于类型构造函数的某个应用程序
    RandT
    。这个东西有种
    *->(*->*)->*->*->*
    ,它的意思大致是:

  • 第一个参数是随机数生成器的类型
  • 第二个参数是一些单子
  • 返回一个Monad(即第三个参数是Monad中的类型,结果是Monad)
  • 让我们看看第二个论点。这是
    ReaderT
    的一个应用程序,一种类型级别的东西
    *->(*->*)->*->*->*
    。第一个论点是你想读的东西(世界的状态)。第二个是你想要建立的单子。在本例中,
    渲染
    ,我假设让您边走边构建艺术。没有第三种,所以就像在普通的哈斯凯尔(Haskell)中使用咖喱一样,这种咖喱的结果是
    *->*
    ,这是
    RandT
    想要的那种


    阅读的方法是:
    Generate
    是一种单子,可以使用随机数生成(使用标准生成器),读取类型为
    World
    的值,然后渲染艺术。

    由于到目前为止还没有人提到它,所以您要查找的术语是Monad transformer。Monad transformers允许您在现有动作类型的基础上添加各种效果。示例包括
    ReaderT
    StateT
    MaybeT
    。因此,在您的示例中,您有:

    • Render
      是描述渲染操作的
      Monad


    • ReaderT World
      是一个monad转换器;当应用于monad时,它会生成一个monad,该monad可以读取类型为
      World
      的不可变环境。因此,
      ReaderT World Render
      是一个描述
      Render
      动作的monad,它还存储了一个
      World
      ,可以通过
      ask
      asks
      这种类型的内部动作来读取,例如,
      World,因为到目前为止还没有人提到过它,所以您要寻找的术语是monad transformer。Monad transformers允许您在现有动作类型的基础上添加各种效果。示例包括
      ReaderT
      StateT
      MaybeT
      。因此,在您的示例中,您有:

      • Render
        是描述渲染操作的
        Monad


      • ReaderT World
        是一个monad转换器;当应用于monad时,它会生成一个monad,该monad可以读取类型为
        World
        的不可变环境。因此,
        ReaderT World Render
        是一个monad,它描述了
        Render
        操作,还存储了一个
        World
        ,可以通过
        ask
        asks
        这种类型的内部操作来读取,例如,
        World这是一个类型别名。因此,您可以编写
        生成一个
        ,但在幕后是
        RandT StdGen(ReaderT World Render)一个
        。它不是一个产品类型声明。这类似于
        datat