Haskell 使用DataTypes扩展的更简洁的写入方式(Proxy::Proxy 42)

Haskell 使用DataTypes扩展的更简洁的写入方式(Proxy::Proxy 42),haskell,Haskell,我一直在使用datatypes扩展以一种类型安全的方式将typelevelNats传递给函数,我只是想知道是否有更好的书写方式: (Proxy :: Proxy 42) 例如,如果类型系统看到参数需要,是否有任何扩展将自动将文本42升级为(Proxy::Proxy 42) 我想我在某处读到过一本,但现在找不到了。我认为让用户编写(Proxy::Proxy 42)有点难看。首先,如果启用,可以省略代理: {-# LANGUAGE PartialTypeSignatures #-} (Proxy

我一直在使用
datatypes
扩展以一种类型安全的方式将typelevel
Nat
s传递给函数,我只是想知道是否有更好的书写方式:

(Proxy :: Proxy 42)
例如,如果类型系统看到参数需要,是否有任何扩展将自动将文本
42
升级为
(Proxy::Proxy 42)

我想我在某处读到过一本,但现在找不到了。我认为让用户编写
(Proxy::Proxy 42)
有点难看。

首先,如果启用,可以省略
代理:

{-# LANGUAGE PartialTypeSignatures #-}

(Proxy :: _ 42)
第二,在GHC 8中是一个更整洁的解决方案。它允许我们为所有
绑定的参数显式提供前缀为@的

{-# LANGUAGE TypeApplications, RankNTypes, DataKinds, TypeFamilies #-}

import Data.Proxy
import GHC.TypeLits

foo :: forall (n :: Nat) a. a -> a
foo x = x

bar :: ()
bar = foo @10 () -- apply the type nat literal explicitly