标签: template-haskell

Haskell中的多项式因式分解

hammar的帮助下,我制作了一个模块Haskell位编译

$(zModP 5)
Run Code Online (Sandbox Code Playgroud)

newtype Z5 = Z5 Int
instance Additive.C Z5 where
  (Z5 x) + (Z5 y) = Z5 $ (x + y) `mod` 5
...
Run Code Online (Sandbox Code Playgroud)

我现在面临一个问题,我不认为我可以这样解决.

关于多项式的一个显着事实是它们在有理数中是不可约的,如果它们是不可约的模数p.我已经有一种方法,蛮力试图在给定(有限)场上对多项式进行分解.

我想尝试为多个字段运行此函数.这就是我想要的东西:

isIrreducible :: (FiniteField.C a) => Poly.T a -> Bool
isIrreducible p = ...

intPolyIrreducible :: Poly.T Int -> Bool
intPolyIrreducible p = isIrreducible (p :: Poly.T Z2) ||
                       isIrreducible (p :: Poly.T Z3) ||
                       isIrreducible (p :: Poly.T Z5) ||
                       ...
Run Code Online (Sandbox Code Playgroud)

基本上我想尝试运行我的因子算法来进行大量的"除法"定义.

我认为这可能与TH有关,但似乎需要永远.我想知道将参数算术作为参数传递给我会更容易isIrreducible吗?

或者看起来这可能是Newtype模块可以帮助的东西,但我想不出如果没有以一种同样难的方式使用TH它会如何工作...... …

haskell abstract-algebra template-haskell

8
推荐指数
1
解决办法
939
查看次数

导出Show的模板Haskell数据声明

以下内容无法编译:

import Language.Haskell.TH
makeAlpha n = [d| data Alpha = Alpha $(conT n) deriving (Show, Read) |]
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚错误意味着什么:

Can't derive instances where the instance context mentions
type variables that are not data type parameters
  Offending constraint: Show t_d
When deriving the instance for (Show Alpha)
In the Template Haskell quotation
  [d| data Alpha = Alpha $(conT n) deriving (Show, Read) |]
In the expression:
  [d| data Alpha = Alpha $(conT n) deriving (Show, Read) |]
Run Code Online (Sandbox Code Playgroud)

有可能做这样的派生吗?

haskell template-haskell

8
推荐指数
1
解决办法
359
查看次数

如何使用Template Haskell生成的代码创建非TH包?

我正在制作一个小包,为元组定义包装器,并添加实例形式,如

newtype Tuple2 a = Tuple2 { untuple2 :: (a, a) }
  deriving (...)

tuple2 :: a -> a -> Tuple2 a
tuple2 = ...

instance Traversable Tuple2 where ...
instance Foldable Tuple2 where ...
instance Functor Tuple2 where ...
instance Applicative Tuple2 where ...
Run Code Online (Sandbox Code Playgroud)

这从2到15重复,所以它看起来像模板Haskell的工作.

生成的代码总是与Haskell 98兼容,所以我希望最终的结果也是Haskell 98兼容的软件包.是否可以使用Template Haskell生成一段代码并从中创建一个不使用TH本身的包?(如果可能的话,我更喜欢自动化方式.)

haskell tuples template-haskell

8
推荐指数
1
解决办法
172
查看次数

基于可用约束确定方法的实现

假设我必须执行以下记忆功能.(请忽略它们纯粹的事实.)

memoEq   :: Eq a       => (a -> b) -> a -> b
memoOrd  :: Ord a      => (a -> b) -> a -> b
memoHash :: Hashable a => (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)

现在我想要一个允许我选择上述三个备忘录函数中"最佳"的构造.基本上做以下事情的东西:

memo f = case constraint_of_typevar_a_in f of
  Eq a       -> memoEq
  Ord a      -> memoOrd
  Hashable a -> memoHash
Run Code Online (Sandbox Code Playgroud)

你可以尝试使用类型类,但是你会得到重叠的实例:

class Memo a where
  memo :: (a -> b) -> a -> b

instance Eq a => Memo a where
  memo = …
Run Code Online (Sandbox Code Playgroud)

haskell template-haskell

8
推荐指数
1
解决办法
190
查看次数

如何在monad中执行每个语句时写一个打印"N的步骤i"的monad?

我甚至不确定任何一种单子都有可能; 它违反了monad法律吗?但似乎在某种构造或其他方面应该是可能的.具体是有什么方法可以写一些我可以写的东西

do
  someOp ()
  someOtherOp ()
  thirdOp ()
Run Code Online (Sandbox Code Playgroud)

它会打印出来

step 1 of 3
step 2 of 3
step 3 of 3
Run Code Online (Sandbox Code Playgroud)

这需要模板Haskell还是monad工作?(如果需要Template Haskell,那么怎么做?)

monads haskell template-haskell

8
推荐指数
2
解决办法
353
查看次数

带参数的QuasiQuote

我想在Haskell中写一个引文.name参数需要传递给gen函数以生成声明.

quote ::  String -> QuasiQuoter
quote name = QuasiQuoter {
       quoteExp = undefined,
       quotePat = undefined,
       quoteType = undefined,
       quoteDec = \jsonStr -> gen name (getValue str)
     }
Run Code Online (Sandbox Code Playgroud)

但是,似乎我不能像这样使用报价

[quote "Hello"| from x to y |]
Run Code Online (Sandbox Code Playgroud)

由于Haskell不允许引用声明和引用在同一个令人烦恼的文件中,我该怎样做才能将参数从外部传递到引用中?

haskell template-haskell

8
推荐指数
1
解决办法
491
查看次数

模板haskell中的拼接类型签名

我正在尝试为模板haskell中的函数创建类型签名.有这么简单的方法吗?

在此期间我已经做了一些解决方法,但它应该更容易,对吧?

-- TH.hs
module Lib.TH (mkFunction) where

import Language.Haskell.TH

mkFunction n = do
  let name = mkName n
  [d|
    $( ... ) :: Integer -> Integer
    $(varP name) = \x -> x + 2|]

-- Other.hs
import TH

mkFunction "test"
Run Code Online (Sandbox Code Playgroud)

我应该在$( ... )上面写什么?我试过的一切都会产生

Invalid type signature: ... :: Integer -> Integer
Should be of form <variable> :: <type>
Run Code Online (Sandbox Code Playgroud)

haskell template-haskell

8
推荐指数
1
解决办法
479
查看次数

Template Haskell声明中的局部变量

我正在阅读pozorvlak在Template Haskell上发布的婴儿步骤帖子,试图自己理解它,我发现了这一部分:

回想一下,我们试图以编程方式生成表单的声明data Fred = Fred.让我们用quasiquoting来试试吧.由于调用TH代码的限制,我们必须将它放在自己的模块中,所以让我们将以下内容放在Keyword.h中,以便编译器可以找到它:

module Keyword (keyword) where

import Language.Haskell.TH.Syntax
keyword name = [d| data $(name) = $(name) |]
Run Code Online (Sandbox Code Playgroud)

现在编译:

Prelude> :l Keyword.hs
[1 of 1] Compiling Keyword          ( Keyword.hs, interpreted )

Keyword.hs:6:24: parse error on input `$('
Run Code Online (Sandbox Code Playgroud)

这跟我打了个响铃,看起来和我最近读到的其他东西一样,模板Haskell包文档:

对于动态绑定的thing(NameS),我们可能希望它们以依赖于上下文的方式,因此我们再次不需要名称空间.例如:

let v = mkName "T" in [| data $v = $v |]
Run Code Online (Sandbox Code Playgroud)

这里我们Name对类型构造函数和数据构造函数使用相同的

嗯,这几乎是一样的,让我们看看我能不能这样做:

 module Example where
 import Language.Haskell.TH
 let v = mkName "T" in [| data $v …
Run Code Online (Sandbox Code Playgroud)

haskell template-haskell

7
推荐指数
1
解决办法
994
查看次数

带有模板haskell的多个函数定义

假设我有这样的数据类型:

data Color = Red | Blue | Green
Run Code Online (Sandbox Code Playgroud)

如何使用templatehaskell生成这样的函数?

myShow Red   = ...
myShow Blue  = ...
myShow Green = ...
Run Code Online (Sandbox Code Playgroud)

即我正在寻找基于模式匹配的函数的多个定义.

haskell template-haskell

7
推荐指数
1
解决办法
99
查看次数

在Template Haskell splice中规范化类型族实例

我正在使用该genifunctors包为其定义涉及类型族的类型生成仿函数实例.

第一个模块定义数据类型本身:

{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE DataKinds #-}
module Temp where

data Record (p :: (*,*))

type family Fst p where Fst (Record '(a,b)) = a
type family Snd p where Snd (Record '(a,b)) = b

data Bar s = Bar {
  field_a :: Fst s,
  field_b :: Snd s
}

newtype Baz a = Baz { getBaz :: Bar (Record '(Maybe a, [a])) }
Run Code Online (Sandbox Code Playgroud)

这与预期一样:

?> import Temp 
?> :t Baz …
Run Code Online (Sandbox Code Playgroud)

haskell ghc type-families template-haskell data-kinds

7
推荐指数
0
解决办法
187
查看次数