我一直在使用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)
| 归档时间: |
|
| 查看次数: |
109 次 |
| 最近记录: |