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

时间:2016-02-15 10:30:11

标签: haskell

我一直在使用bool IsEquals(IMyThing other){//check if equals}扩展名以类型安全的方式将类型级别DataKinds传递给函数,我只是想知道是否有更好的写作方式:

Nat

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

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

1 个答案:

答案 0 :(得分:10)

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

{-# LANGUAGE PartialTypeSignatures #-}

(Proxy :: _ 42)

其次,GHC 8中的TypeApplications是一个更简洁的解决方案。它允许我们使用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