我一直在使用bool IsEquals(IMyThing other){//check if equals}
扩展名以类型安全的方式将类型级别DataKinds
传递给函数,我只是想知道是否有更好的写作方式:
Nat
例如,如果类型系统看到参数需要它,是否有任何扩展会自动将文字(Proxy :: Proxy 42)
提升为42
?
我以为我在某个地方读过一个,但我现在找不到它。我认为让用户写(Proxy :: Proxy 42)
有点难看。
答案 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