我正在编写一个小的Haskell编译器,我想尽可能多地实现Haskell 2010.我的编译器可以解析模块,但是将模块完成到程序似乎是一项非常重要的任务.我编写了一些棘手但可能有效的Haskell模块示例:
module F(G.x) where
import F as G
x = 2
Run Code Online (Sandbox Code Playgroud)
这里模块F导出G.x,但是G.x相同F.x,因此模块F导出x当且仅当它导出时x.
module A(a) where
import B(a)
a = 2
module B(a) where
import A(a)
Run Code Online (Sandbox Code Playgroud)
在这个例子中,要解决模块的出口A,编译器检查a进口来自B相同的声明a = 2,但B出口a,当且仅当,A出口a.
module A(f) where
import B(f)
module B(f) where
import A(f)
Run Code Online (Sandbox Code Playgroud)
在解析模块期间A,编译器可能假设f从B存在导入,意味着A导出f,因此 …
我想用perl计算字符串中的大写字母数.
例如:我需要知道单词"EeAEzzKUwUHZws"包含多少个大写字符.
我很惊讶CSS中没有"text-decoration:reverse",因为使用JavaScript实现起来似乎很尴尬.IE将元素的前景色和背景色分别设置为父级的背景和前景.
我在这里注意到了JavaScript技术
当然不是那么复杂吗?
我正在学习Haskell,所以我正在写一些简单的纸牌游戏.我已经定义了一些数据类型:
data Rank = Ace|Two|Three|Four|Five|Six|Seven|Eight|Nine|Ten|Jack|Queen|King deriving (Eq,Show,Ord)
data Suit = Hearts|Spades|Diamonds|Clubs deriving (Show)
data Card = Card Rank Suit
Run Code Online (Sandbox Code Playgroud)
现在我想创建一张52张牌的原始牌组.我确信有一种光滑的方式可以做到,但我能想到的只有:
pristineDeck = [Card Ace Hearts, Card Two Hearts, ...]
Run Code Online (Sandbox Code Playgroud)
我可以让Haskell为我生成这个列表吗?
所以我最近提出了这个简洁的想法,希望在严格和懒惰的State变压器模块之间共享代码:
{-# LANGUAGE FlexibleInstances, DataKinds, KindSignatures #-}
module State where
data Strictness = Strict | Lazy
newtype State (t :: Strictness) s a = State (s -> (s, a))
returnState :: a -> State t s a
returnState x = State $ \s -> (s, x)
instance Monad (State Lazy s) where
return = returnState
State ma >>= amb = State $ \s -> case ma s of
~(s', x) -> runState (amb x) s'
instance Monad (State …Run Code Online (Sandbox Code Playgroud) 因此,我的最终目标是通过确保项目导入的所有实体都存在于其声称使用的版本中来评估cabal文件中依赖项的准确性.
一个好的开始是找到单个源文件使用的所有导入实体的列表,可选地提供有关它们来自何处的信息.
我现在愿意忽略类实例的情况,因为检测它们的使用并不是那么简单.
理想的答案是指向一个完全如此的工具,但我也会接受一个答案,指出我需要自己编写一个资源(GHC收集这些信息吗?它会把它转移到哪里吗?可以吗?被说服这样做?)
下面是我了解Relation.Binary.PropositionalEquality.TrustMe.trustMe:它似乎采取一种随意x和y和:
x并且y真的相等,那就变成了reflpostulate lie : x ? y.现在,在后一种情况下,它很容易使Agda不一致,但这本身并不是一个问题:它只是意味着任何证明使用trustMe都是通过诉诸权威的证明.此外,虽然你可以使用这样的东西来编写coerce : {A B : Set} -> A -> B,但事实证明是这种情况coerce {?} {Bool} 0并没有减少(至少不是根据Cc Cn),所以它实际上并不像Haskell的语义踩踏那样unsafeCoerce.
那么我有什么可怕的trustMe呢?另一方面,是否有理由在实现原语之外使用它?
假设我有一个使用 Cabal 打包和构建的库,并且某些模块Internal不在我的 cabal 文件的Exposed-modules. 如果我指定一个编译指示,会有什么区别吗?
{-# OPTIONS_HADDOCK hide #-}
Run Code Online (Sandbox Code Playgroud)
位于 的顶部Internal.hs,或者根据 Haddock 的说法它已经自动隐藏了?
如果确实有影响,会产生什么影响?
我刚开始学习模板Haskell,并坚持使用拼接的简单问题.
在一个模块中,我实现了tupleN回复元组的第N个元素的函数:
tupleN :: Lift a => a -> Int -> Q Exp
tupleN a n = do
(TupE as) <- lift a
return $ as !! n
Run Code Online (Sandbox Code Playgroud)
在Main模块中,我有:
main :: IO ()
main = do
let tup = (1::Int,'a',"hello")
putStrLn $ show $(tupleN $tup 1)
Run Code Online (Sandbox Code Playgroud)
这似乎有效,但事实并非如此.编译器打印错误:
GHC stage restriction: `tup'
is used in a top-level splice or annotation,
and must be imported, not defined locally
In the expression: tup
In the first argument of `tupleN', namely `$tup' …Run Code Online (Sandbox Code Playgroud) 我正在尝试将knuthBendix应用于大量的重写规则.因此,我尝试让它在不同的集合上并行工作.
例如,我尝试运行:
import Control.Parallel
import Control.Parallel.Strategies
import Math.Algebra.Group.StringRewriting
knuthBendixOptimized rs = as' `par` bs' `pseq` as' ++ bs' where
(as, bs) = splitAt 3000 rs
as' = knuthBendix as
bs' = knuthBendix bs
Run Code Online (Sandbox Code Playgroud)
我编译使用ghc -threaded,我执行通过+RTS -N.如果我并行运行其他算法,它就可以工作.但对于knuthBendix,它没有.
有人知道解决方案吗?
谢谢,弗兰兹
haskell ×7
agda ×1
cabal ×1
character ×1
colors ×1
compilation ×1
css ×1
data-kinds ×1
haddock ×1
html ×1
javascript ×1
knuth ×1
perl ×1
string ×1
uppercase ×1