小编Ant*_*sky的帖子

使用模板Haskell获取关联的类型同义词

模板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

256
推荐指数
1
解决办法
5501
查看次数

为什么以下Haskell代码是非确定性的?

我一直从Learn You A Haskell学习Haskell ,刚刚发现了以下声明:

(+) <$> [1,2] <*> [4,5,6]在非确定性计算x + y中执行结果,其中x从中获取每个值[1,2]y从中获取每个值[4,5,6].

我不认为我明白什么是非确定性的.只是结果的顺序或计算顺序不能保证每次都相同吗?

haskell

29
推荐指数
3
解决办法
2402
查看次数

Haskell中缀函数应用程序优先级

我们f x y = x * y.我们可以通过两种方式应用此函数:f 5 6或者,使用中缀表示法5 `f` 6.运算符规则是否适用于最后一个表达式?这个应用程序有什么优先权?它只是另一种形式的功能应用程序,它也具有最高优先级吗?

我想编译器会看到这种特殊形式(由于``和/或名称以字母(?)开头),并且实际上将其视为普通函数应用程序,而不是将其视为运算符.

haskell function operators infix-notation operator-precedence

24
推荐指数
2
解决办法
1万
查看次数

Monad是一个替代但不是MonadPlus的例子是什么?

他的回答这个问题"类型类之间的区别MonadPlus,Alternative以及Monoid?",爱德华Kmett说,

而且,即使Applicative是超级课程Monad,你最终还是需要MonadPlus上课,因为顺从

empty <*> m = empty
Run Code Online (Sandbox Code Playgroud)

并不足以证明这一点

empty >>= f = empty
Run Code Online (Sandbox Code Playgroud)

因此声称某事物是一件事,MonadPlus比宣称事情要强Alternative.

很明显,任何适用函子是不是一个单子是自动的一个例子Alternative是不是MonadPlus,但爱德华Kmett的回答意味着存在一个单子这是一个Alternative,但不是一个MonadPlus:它empty<|>将满足Alternative法律,1而不是MonadPlus法律.2 我自己无法想出这样的例子; 有人知道吗?


1我无法找到一套规则的规范参考Alternative,但是我将我认为它们的内容大概放在我对" 类型类的含义及其与其他类型的关系的混淆"这一问题的答案的中间.类"(搜索短语"正确的分配").我认为应该遵守的四项法律是:Alternative

  1. 正确的分配性<*>:  (f …

math monads haskell applicative

24
推荐指数
1
解决办法
874
查看次数

Haskell的图像绘制库?

我正在制作一个用于播放空间游戏的Haskell程序:我有一组"个人"玩囚徒困境的图表,但只有他们的近邻,并且复制了做得最好的人的策略.

我已达到了一个我需要画出世界形象的地步,这就是我遇到问题的地方.两种可能的几何形状很容易:如果人们每个都有四个或八个邻居,那么我将每个几何表示为一个填充的正方形(颜色对应于策略)并用这些对齐平面.但是,我也有一种情况,人们有六个邻居(六边形)或三个邻居(三角形).

那么我的问题是:什么是用于创建图像和在其上绘制形状的好Haskell库? 我更喜欢它创造PNG,但我并不难以置信.我最初使用的是Graphics.GD,但它只导出绑定到绘制点,线,弧,椭圆和非旋转矩形的函数,这对我的目的来说是不够的(除非我想逐个像素地绘制六边形*) .我考虑使用foreign import,但它证明有点麻烦(部分原因是多边形绘制函数需要一个gdPoint结构数组),并且鉴于我的要求可能会增长,使用in-Haskell解决方案并不具备与FFI相关(虽然如果推动推动,我愿意这样做).有什么建议?

*这也是一种选择,其实; 关于如何做到这一点的任何提示也会受到赞赏,尽管我认为图书馆会更容易.

编辑:非常感谢您的建议.不幸的是,我无法获得所有gtk2hs所需的库来构建,这排除了很多解决方案.出于各种原因,在我尝试了所有答案之后,未能安装多个库并发现其他人无法做我想要的事情,我最终决定只为libgd导出更多的FFI并使用它.

graphics haskell image

23
推荐指数
4
解决办法
7226
查看次数

如何在C中清除文件的全部内容?

我有一个带有user1数据的文件.我想通过清除文件的内容为user2使用相同的文件.

我的想法是,当一个新用户来时,前一个用户的数据应该是清楚的,并且应该为新用户准备相同的文件.

c file-io file file-handling

21
推荐指数
4
解决办法
8万
查看次数

Haskell中的程序化类型注释

当元编程时,传递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)

haskell types type-systems metaprogramming hindley-milner

14
推荐指数
2
解决办法
1151
查看次数

Haskell ReaderT设计模式与MTL StateT模式

我正在设计一个基本上使用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

12
推荐指数
1
解决办法
327
查看次数

构造函数中的不可见/隐藏字段

我正在通过学习你是一个很好的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)

通过纠正lastnamelastName我删除了错误.

题:

在错误消息中,该词(visible)暗示我必须有可能将字段声明为隐藏/不可见.这是否正确?如果是,我如何将构造函数中的字段声明为隐藏,以及需要声明隐藏字段的一般情况是什么?如果您可以通过给出一个简单的使用示例来解释这一点,那将是值得赞赏的.

注意:我找不到有关LYAH中隐藏或隐藏字段的任何参考/详细信息.

haskell types derived-types derived-instances

11
推荐指数
1
解决办法
1236
查看次数

我可以通过评估字符串在运行时创建函数吗?

在我解决离散数学的程序中,我想让用户输入一串逻辑运算; 例如,如果用户输入let f (x:y:_) = x && y,那么我将得到一个功能,f用于该程序的其余部分.在GHCi中,我可以通过输入轻松测试我的程序let f (x:y:_) = x && y.

我不知道如何完成这项任务.我已经evalplugins包中看了一下这个函数,但它似乎不是正确的函数.我可以在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)

haskell eval

9
推荐指数
3
解决办法
1323
查看次数