@符号在Haskell的表达式中有何作用?
我试图弄清楚@像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
回答
有两个相关的扩展文档需要阅读:TypeApplications和DataKinds. 类型应用程序文档中的一个片段:
该
TypeApplications扩展允许您在表达式中使用可见类型应用程序。下面是一个例子:show (read @Int "5"). 的@Int是可见的类型的应用程序; 它指定 的类型中的类型变量的值read。
从数据类型文档中:
使用
DataKinds,GHC 会自动将每个数据类型提升为一种类型,并将其(值)构造函数提升为类型构造函数。
我想您还必须了解Symbol,一种比 type-level 更有效(但功能较少)的字符串类型级表示[Char],但我在官方文档中找不到合适的地方来阅读它。你可以在一些GHC.TypeLits黑线鳕中读到它。