模板Haskell可以找出类型类中声明的关联类型同义词的名称和/或声明吗?我希望reify能做我想做的事,但似乎并没有提供所有必要的信息.它适用于获取函数类型签名:
% ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
...
Prelude> -- I'll be inserting line breaks and whitespace for clarity
Prelude> -- in all GHCi output.
Prelude> :set -XTemplateHaskell
Prelude> import Language.Haskell.TH
Prelude Language.Haskell.TH> class C a where f :: a -> Int
Prelude Language.Haskell.TH> putStrLn $(stringE . show =<< reify ''C)
ClassI (ClassD [] Ghci1.C [PlainTV a_1627398388] []
[SigD Ghci1.f
(ForallT [PlainTV a_1627398388]
[ClassP Ghci1.C [VarT a_1627398388]]
(AppT (AppT ArrowT (VarT a_1627398388))
(ConT GHC.Types.Int)))])
[] …Run Code Online (Sandbox Code Playgroud) haskell type-families reify template-haskell associated-types
我一直从Learn You A Haskell学习Haskell ,刚刚发现了以下声明:
(+) <$> [1,2] <*> [4,5,6]在非确定性计算x + y中执行结果,其中x从中获取每个值[1,2]并y从中获取每个值[4,5,6].
我不认为我明白什么是非确定性的.只是结果的顺序或计算顺序不能保证每次都相同吗?
我们f x y = x * y.我们可以通过两种方式应用此函数:f 5 6或者,使用中缀表示法5 `f` 6.运算符规则是否适用于最后一个表达式?这个应用程序有什么优先权?它只是另一种形式的功能应用程序,它也具有最高优先级吗?
我想编译器会看到这种特殊形式(由于``和/或名称以字母(?)开头),并且实际上将其视为普通函数应用程序,而不是将其视为运算符.
haskell function operators infix-notation operator-precedence
在他的回答这个问题"类型类之间的区别MonadPlus,Alternative以及Monoid?",爱德华Kmett说,
而且,即使
Applicative是超级课程Monad,你最终还是需要MonadPlus上课,因为顺从Run Code Online (Sandbox Code Playgroud)empty <*> m = empty并不足以证明这一点
Run Code Online (Sandbox Code Playgroud)empty >>= f = empty因此声称某事物是一件事,
MonadPlus比宣称事情要强Alternative.
很明显,任何适用函子是不是一个单子是自动的一个例子Alternative是不是MonadPlus,但爱德华Kmett的回答意味着存在一个单子这是一个Alternative,但不是一个MonadPlus:它empty和<|>将满足Alternative法律,1而不是MonadPlus法律.2 我自己无法想出这样的例子; 有人知道吗?
1我无法找到一套规则的规范参考Alternative,但是我将我认为它们的内容大概放在我对" 类型类的含义及其与其他类型的关系的混淆"这一问题的答案的中间.类"(搜索短语"正确的分配").我认为应该遵守的四项法律是:Alternative
<*>: (f …我正在制作一个用于播放空间游戏的Haskell程序:我有一组"个人"玩囚徒困境的图表,但只有他们的近邻,并且复制了做得最好的人的策略.
我已达到了一个我需要画出世界形象的地步,这就是我遇到问题的地方.两种可能的几何形状很容易:如果人们每个都有四个或八个邻居,那么我将每个几何表示为一个填充的正方形(颜色对应于策略)并用这些对齐平面.但是,我也有一种情况,人们有六个邻居(六边形)或三个邻居(三角形).
那么我的问题是:什么是用于创建图像和在其上绘制形状的好Haskell库? 我更喜欢它创造PNG,但我并不难以置信.我最初使用的是Graphics.GD,但它只导出绑定到绘制点,线,弧,椭圆和非旋转矩形的函数,这对我的目的来说是不够的(除非我想逐个像素地绘制六边形*) .我考虑使用foreign import,但它证明有点麻烦(部分原因是多边形绘制函数需要一个gdPoint结构数组),并且鉴于我的要求可能会增长,使用in-Haskell解决方案并不具备与FFI相关(虽然如果推动推动,我愿意这样做).有什么建议?
*这是也是一种选择,其实; 关于如何做到这一点的任何提示也会受到赞赏,尽管我认为图书馆会更容易.
编辑:非常感谢您的建议.不幸的是,我无法获得所有gtk2hs所需的库来构建,这排除了很多解决方案.出于各种原因,在我尝试了所有答案之后,未能安装多个库并发现其他人无法做我想要的事情,我最终决定只为libgd导出更多的FFI并使用它.
我有一个带有user1数据的文件.我想通过清除文件的内容为user2使用相同的文件.
我的想法是,当一个新用户来时,前一个用户的数据应该是清楚的,并且应该为新用户准备相同的文件.
当元编程时,传递Haskell的类型系统信息可能是有用的(或必要的),这些信息是关于程序已知但在Hindley-Milner中不可推断的类型.是否有一个库(或语言扩展等)提供了执行此操作的工具 - 即Haskell中的编程类型注释?
考虑一种情况,即您正在使用异构列表(使用Data.Dynamic库或存在量化实现,比如说),并且您希望将列表过滤到沼泽标准,同质类型的Haskell列表.你可以写一个像这样的函数
import Data.Dynamic
import Data.Typeable
dynListToList :: (Typeable a) => [Dynamic] -> [a]
dynListToList = (map fromJust) . (filter isJust) . (map fromDynamic)
Run Code Online (Sandbox Code Playgroud)
并使用手动类型注释调用它.例如,
foo :: [Int]
foo = dynListToList [ toDyn (1 :: Int)
, toDyn (2 :: Int)
, toDyn ("foo" :: String) ]
Run Code Online (Sandbox Code Playgroud)
这foo是清单[1, 2] :: [Int]; 这很好,你回到了坚实的基础,Haskell的类型系统可以做到这一点.
现在想象你想要做同样的事情,但是(a)当你编写代码时,你不知道调用产生的列表类型是什么dynListToList,但是(b)你的程序确实包含只有(c)它不是类型系统可访问的形式.
例如,假设您从异类列表中随机选择了一个项目,并且希望按该类型过滤列表.使用提供的类型检查工具Data.Typeable,您的程序具有执行此操作所需的所有信息,但据我所知 - 这是问题的本质 - 没有办法将其传递给类型系统.这是一些伪Haskell,它显示了我的意思:
import Data.Dynamic
import Data.Typeable
randList :: (Typeable a) …Run Code Online (Sandbox Code Playgroud) 我正在设计一个基本上使用StateT并只是更新状态的小型游戏。以下是简化版本:
{-# LANGUAGE TemplateHaskell #-}
import Control.Lens
import Control.Monad
import Control.Monad.IO.Class
import Control.Monad.State
import Control.Monad.State.Class
import System.Random
data PlayerState = PlayerState {
_psName :: String,
_psScore :: Int
} deriving (Show)
makeClassy ''PlayerState
data Game = Game {
_turns :: Int,
_players :: [PlayerState]
} deriving (Show)
makeClassy ''Game
randomGameInit :: IO Game
randomGameInit = do
players <- replicateM 5 $ PlayerState <$> (replicateM 4 $ randomRIO ('a', 'z')) <*> randomRIO (1,10)
return $ Game 0 players
update :: (MonadState …Run Code Online (Sandbox Code Playgroud) 我正在通过学习你是一个很好的Haskell,我已达到第8.4节"衍生实例".在本节中,有以下数据类型声明:
data Person = Person { firstName :: String
, lastName :: String
, age :: Int
} deriving (Eq)
Run Code Online (Sandbox Code Playgroud)
一边试试
*Main> mikeD == Person {firstName = "Michael", lastname = "Diamond", age = 43}
Run Code Online (Sandbox Code Playgroud)
我收到以下错误:
<interactive>:55:41:
`lastname' is not a (visible) field of constructor `Person'
Run Code Online (Sandbox Code Playgroud)
通过纠正lastname到lastName我删除了错误.
题:
在错误消息中,该词(visible)暗示我必须有可能将字段声明为隐藏/不可见.这是否正确?如果是,我如何将构造函数中的字段声明为隐藏,以及需要声明隐藏字段的一般情况是什么?如果您可以通过给出一个简单的使用示例来解释这一点,那将是值得赞赏的.
注意:我找不到有关LYAH中隐藏或隐藏字段的任何参考/详细信息.
在我解决离散数学的程序中,我想让用户输入一串逻辑运算; 例如,如果用户输入let f (x:y:_) = x && y,那么我将得到一个功能,f用于该程序的其余部分.在GHCi中,我可以通过输入轻松测试我的程序let f (x:y:_) = x && y.
我不知道如何完成这项任务.我已经eval从plugins包中看了一下这个函数,但它似乎不是正确的函数.我可以在Haskell中这样做吗?
我计划使用它的代码是:
type TruthTable = [[Bool]]
type TruthTableResult = [([Bool], Bool)]
solveTable :: ([Bool] -> Bool) -> Integer -> (TruthTableResult)
solveTable f n = let table = truthTable n
result = map f table
in zipWith (\v r -> (v, r)) table result
Run Code Online (Sandbox Code Playgroud)