类型安全的模块化算术无注释
Type safe modular arthmetic no annotation
有许多 Haskell mod 元算法 mod 实现类型安全的规则 mod 带有类型注释的元算法。是否可以在类型注解中传入一个变量?
例如在modmodule下面的作品
let x = 4 :: Mod 7
let y = 5 :: Mod 7
print x + y
有什么办法可以达到类似下面的效果
let base = 7
let x = 4 :: Mod base
let y = 5 :: Mod base
print x + y
我的问题是 base
不是一个类型。我不确定解决这个问题的正确方法,或者我是否以错误的方式考虑函数式语言。谢谢
更新
在实践中,base 将是我事先不知道的一些计算的结果。
由 base
参数化的值是一个多态值:
import Data.Mod
import GHC.TypeNats (Nat)
nine :: KnownNat base => Mod base
nine =
let x = 4
y = 5
in x + y -- Let type inference do the work of deducing that x, y :: Mod base
要显式注释这些表达式,请使用 ScopedTypeVariables
以能够引用 base
类型变量。这也需要base
明确量化:
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Mod
import GHC.TypeNats (Nat)
nine :: forall base. KnownNat base => Mod base
nine =
let x = 4 :: Mod base
y = 5 :: Mod base
in x + y
我发现了一个类似的问题
这可以在给定的示例中应用,如
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE KindSignatures #-}
module Main where
import GHC.TypeLits
import Data.Proxy
import Data.Mod as M
f x = x + 2
main :: IO ()
main = do
let y = f 5
let Just someNat = someNatVal y
case someNat of
SomeNat (_ :: Proxy n) -> do
let x = 4 :: M.Mod n
let y = 5 :: M.Mod n
print $ x + y
有许多 Haskell mod 元算法 mod 实现类型安全的规则 mod 带有类型注释的元算法。是否可以在类型注解中传入一个变量?
例如在modmodule下面的作品
let x = 4 :: Mod 7
let y = 5 :: Mod 7
print x + y
有什么办法可以达到类似下面的效果
let base = 7
let x = 4 :: Mod base
let y = 5 :: Mod base
print x + y
我的问题是 base
不是一个类型。我不确定解决这个问题的正确方法,或者我是否以错误的方式考虑函数式语言。谢谢
更新
在实践中,base 将是我事先不知道的一些计算的结果。
由 base
参数化的值是一个多态值:
import Data.Mod
import GHC.TypeNats (Nat)
nine :: KnownNat base => Mod base
nine =
let x = 4
y = 5
in x + y -- Let type inference do the work of deducing that x, y :: Mod base
要显式注释这些表达式,请使用 ScopedTypeVariables
以能够引用 base
类型变量。这也需要base
明确量化:
{-# LANGUAGE ScopedTypeVariables #-}
import Data.Mod
import GHC.TypeNats (Nat)
nine :: forall base. KnownNat base => Mod base
nine =
let x = 4 :: Mod base
y = 5 :: Mod base
in x + y
我发现了一个类似的问题
这可以在给定的示例中应用,如
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE KindSignatures #-}
module Main where
import GHC.TypeLits
import Data.Proxy
import Data.Mod as M
f x = x + 2
main :: IO ()
main = do
let y = f 5
let Just someNat = someNatVal y
case someNat of
SomeNat (_ :: Proxy n) -> do
let x = 4 :: M.Mod n
let y = 5 :: M.Mod n
print $ x + y