【问题标题】:What does the @ symbol do within an expression in Haskell?@ 符号在 Haskell 中的表达式中有什么作用?
【发布时间】:2021-04-12 13:51:03
【问题描述】:

我试图弄清楚@endpoint @"start" 这样的表达式中做了什么。它可能是语言扩展的一部分吗?

我看到该功能所在的模块启用了以下扩展。

{-# LANGUAGE DataKinds                  #-}
{-# LANGUAGE DeriveAnyClass             #-}
{-# LANGUAGE DeriveGeneric              #-}
{-# LANGUAGE DerivingStrategies         #-}
{-# LANGUAGE FlexibleContexts           #-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
{-# LANGUAGE LambdaCase                 #-}
{-# LANGUAGE MultiParamTypeClasses      #-}
{-# LANGUAGE NoImplicitPrelude          #-}
{-# LANGUAGE OverloadedStrings          #-}
{-# LANGUAGE RecordWildCards            #-}
{-# LANGUAGE ScopedTypeVariables        #-}
{-# LANGUAGE TemplateHaskell            #-}
{-# LANGUAGE TypeApplications           #-}
{-# LANGUAGE TypeFamilies               #-}
{-# LANGUAGE TypeOperators              #-}

完整功能:

endpoints :: Contract () AuctionSchema Text ()
endpoints = (start' `select` bid' `select` close') >> endpoints
  where
    start' = endpoint @"start" >>= start
    bid'   = endpoint @"bid"   >>= bid
    close' = endpoint @"close" >>= close

【问题讨论】:

  • 这是-XTypeApplications 与类型级字符串文字的结合。

标签: haskell


【解决方案1】:

有两个相关的扩展文档可供阅读:TypeApplicationsDataKinds。来自类型应用程序文档的 sn-p:

TypeApplications 扩展允许您在表达式中使用可见类型应用程序。这是一个示例:show (read @Int "5")@Int 是可见类型应用程序;它指定read的类型中类型变量的值。

从数据种类文档中:

使用DataKinds,GHC 自动将每个数据类型提升为一种类型,并将其(值)构造函数提升为类型构造函数。

我猜你也必须了解Symbol,这是一种字符串的类型级表示,比类型级[Char] 更有效(但功能更少),但我找不到好地方在官方文档中阅读它。您可以在GHC.TypeLits haddocks 中了解它。

【讨论】:

猜你喜欢
  • 2020-02-15
  • 1970-01-01
  • 2011-03-17
  • 2012-08-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多