更简洁的写作方式(Proxy :: Proxy 42)使用DataKinds扩展

Cli*_*ton 3 haskell

我一直在使用DataKinds扩展来Nat以类型安全的方式将类型级别传递给函数,我只是想知道是否有更好的编写方式:

(Proxy :: Proxy 42)
Run Code Online (Sandbox Code Playgroud)

例如,是否有将自动促进字面任何扩展42(Proxy :: Proxy 42)如果类型系统看到参数需要呢?

我以为我在某个地方看过一个,但我现在找不到它.(Proxy :: Proxy 42)我认为让用户写作有点难看.

And*_*ács 10

首先,如果启用PartialTypeSignatures,则可以省略Proxy:

{-# LANGUAGE PartialTypeSignatures #-}

(Proxy :: _ 42)
Run Code Online (Sandbox Code Playgroud)

其次,TypeApplicationsGHC 8是一个更简洁的解决方案.它允许我们forall使用@前缀明确地提供绑定参数:

{-# 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
Run Code Online (Sandbox Code Playgroud)