我的模块中有以下模板Haskell代码,它是更大的应用程序的一部分.
$(derive makeFoldable ''JStatement)
Run Code Online (Sandbox Code Playgroud)
我怀疑生成的Foldable实例并不是我最初的想法,但我找不到验证方法.那么,最好只使用ghci,是否可以查看生成的实例?
我尝试了以下内容并得到了语法错误,我猜这是因为我做错了.
> derive makeFoldable ''JStatement
<interactive>:1:21:
lexical error in string/character literal at character '\''
Run Code Online (Sandbox Code Playgroud) 假设我有一个任意模块
module Foo where
foo :: Moo -> Goo
bar :: Car -> Far
baz :: Can -> Haz
Run Code Online (Sandbox Code Playgroud)
在哪里foo,bar和baz,正确实施等
我想将此模块重新生成为自动生成的数据类型和相应的对象:
import Foo (Moo, Goo, Car, Far, Can, Haz)
import qualified Foo
data FooModule = Foo
{ foo :: Moo -> Goo
, bar :: Car -> Far
, baz :: Can -> Haz
}
_Foo_ = Foo
{ foo = Foo.foo
, bar = Foo.bar
, baz = Foo.baz
}
Run Code Online (Sandbox Code Playgroud)
名称必须与原始模块完全相同.
我可以手动执行此操作,但这非常繁琐,所以我想编写一些代码来为我执行此任务.
我不确定如何处理这样的任务.Template …
函数reify允许我查找有关给定名称的信息.对于函数,返回的值是VarI:
data Info = ... | VarI Name Type (Maybe Dec) Fixity | ...
Run Code Online (Sandbox Code Playgroud)
在这里,我可以检查函数的类型,我也想检查它的声明.但是,在VarI我总是看到的第三个论点中Nothing.有没有办法获得函数的声明?
我一直在简要地研究Haskell的准引用库.这些库允许Haskell与其他语言集成.为了与C集成,似乎有两个具有类似功能的包:
由于我正在构建自己的准引用库,我对设计选择,API差异,性能等感兴趣.
我所知道的唯一区别是language-c-quote支持C和Objective-C,而inline-c支持C.
你会如何区分这些包裹?有什么根本区别?事实上,它们是否相似?
是否可以使用Template Haskell定义函数?例如
convertStringToValue :: String -> Int
convertStringToValue "three" = 3
convertStringToValue "four" = 4
Run Code Online (Sandbox Code Playgroud)
我也有Map [Char] Int.
fromList [("five",5),("six",6)]
Run Code Online (Sandbox Code Playgroud)
我该如何添加功能
convertStringToValue "six" = 6
convertStringToValue "five" = 5
Run Code Online (Sandbox Code Playgroud)
在编译时使用Template Haskell和Map?使用Template Haskell来达到这个目的似乎很愚蠢,但我还是想知道.
我一直试图在Haskell参考中找到这个的用法:
getHomeR = defaultLayout $ do
setTitle "My Awesome Site"
$(widgetFile "home")
Run Code Online (Sandbox Code Playgroud)
特别:
$(widgetFile "home")
Run Code Online (Sandbox Code Playgroud)
我知道$运算符优先于它的右边,但是我无法理解$()的用法.任何人?
我正在编写一个代表SI前缀的Haskell模块:
module Unit.SI.Prefix where
Run Code Online (Sandbox Code Playgroud)
每个SI前缀都有相应的数据类型:
data Kilo = Kilo deriving Show
data Mega = Mega deriving Show
data Giga = Giga deriving Show
data Tera = Tera deriving Show
-- remaining prefixes omitted for brevity
Run Code Online (Sandbox Code Playgroud)
我想编写一个函数,当应用两个SI前缀时,静态确定两个前缀中的哪一个更小.例如:
-- should compile:
test1 = let Kilo = smaller Kilo Giga in ()
test2 = let Kilo = smaller Giga Kilo in ()
-- should fail to compile:
test3 = let Giga = smaller Kilo Giga in () …Run Code Online (Sandbox Code Playgroud) 我有以下代码实现monad.我正在尝试使用它来简化以后使用更复杂逻辑的字段设置.
data Rec = Rec {
alpha :: Int,
beta :: Double,
} deriving (Show)
defaultRec = Rec 0 0 0
data Record r = Record { runRecord :: Rec -> (Rec, r) }
instance Monad Record where
return r = Record $ \s -> (s, r)
a >>= b = Record $ \s -> let (q, r) = runRecord a s in runRecord (b r) q
createRecord f = fst $ runRecord f defaultRec
changeAlpha x = Record $ …Run Code Online (Sandbox Code Playgroud) 我正在编写一个简单的HashString类,它只是一个字符串及其哈希:
data HashString = HashString Int -- ^ hash
T.Text -- ^ string!
Run Code Online (Sandbox Code Playgroud)
现在我正在尝试在编译时使用以下内容生成这些:
$(hString "hello, world") :: HashString
Run Code Online (Sandbox Code Playgroud)
我想要哈希,文本打包在编译时发生.我该怎么做呢?
这是我到目前为止所尝试的,但我不确定它是否正确,我也不确定它是否在编译时完成了所有工作:
hString :: String -> Q Exp
hString s = [| HashString (hash $ T.pack s) (T.pack s) |]
Run Code Online (Sandbox Code Playgroud) 例如:
let x = 1 in putStrLn [dump|x, x+1|]
Run Code Online (Sandbox Code Playgroud)
会印出类似的东西
x=1, (x+1)=2
Run Code Online (Sandbox Code Playgroud)
即使目前没有这样的东西,是否有可能写出类似的东西?