类型安全的模块化算术无注释

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