我很欣赏Control.Lens包。它确实对Haskell记录语法稍弱的问题有所帮助。我正在开发一个库的一些部分,其中性能是一个令人担忧的问题。有没有人知道,与函数中的基本模式匹配相比,使用如下所示的类型类暴露的简单镜头的性能损失会是什么?使用这样的镜头有可能成为解决记录命名空间冲突问题的一种很好的方法。我可以自己设置一些基准,但我很好奇是否有人可以省去我的麻烦。谢谢。
镜头类
class LensX v where
_x :: Functor f => (Double -> f Double) -> v -> f v
class LensY v where
我有一个记录类型在我的Haskell代码,我想定义一个镜头,可以作为一个吸气剂和设置器。代码如下所示:
data Players = Players { _white :: Player
, _black :: Player
} deriving (Show, Eq)
makeLenses ''Players
_byColor :: Color -> Players -> Player
_byColor White = _white
_byColor Black = _bla
我正在检查,目前没有使用模板的做法-haskell/一些镜头幻想来处理以下简单情况:
data Person = Person {
name :: String,
...
}
data Company = Company {
name :: String,
...
}
目前,我正在避免通过对导入进行限定来污染全局命名空间,但它确实使记录访问变得笨拙。
import Person as P
isFred :: Person -> Bool
isFred p = (P.name p) == "Fred"
是否仍然没有更好的方法来访问记录字段?
我之所以接
我试图为以下数据结构创建镜片。我在用。
data Tree = Tree {
_text :: String,
_subtrees :: [Tree]
} deriving (Show,Eq,Read,Generic)
出于各种原因,我想避免使用模板Haskell。首先,似乎我的ghc版本(7.8.3)无法使用它,这是另一个(超出范围的)问题。
为唱片制作镜片并不难。
text :: Lens' Tree String
text f (Tree text' subtrees') =
(\text'' ->
我的问题与Haskell上的一个程序设计有关。但我想集中在一个具体的用例上。
我定义了一个数据类型(例如Foo),并通过模式匹配在函数(例如f)中使用它。后来,我意识到类型(Foo)需要一些额外的字段来支持新功能。但是,添加该字段会改变该类型的使用方式;即,依赖于该类型的现有函数可能会受到影响。向现有代码添加新功能,无论多么缺乏吸引力,都是很难避免的。我想知道Haskell语言级别的最佳实践是什么,以将此类修改的影响降至最低。
例如,现有代码为:
data Foo = Foo {
vv :: [Int]
}
f :: Foo -> Int
f (Foo v) = sum v
如果我
我不是很好的haskell程序员。我的任务是在我的大学写一个编译器,我选择了haskell,因为它是一个很好的工具。我使用的是monads和ExcepT,所以我有类型:
type Runner r s = StateT s (ExceptT LatteError IO) r
type RT r s = IO (Either LatteError (r, s))
我使用它创建、遍历程序树并生成asm代码,它可以按照我的意愿工作。作为行走树的主要功能,我使用
rProgram :: Program -> Runner [String] CompileState
为了解压结果,我使用函数
ru
有可能在haskell堆栈中使用cpp预处理程序吗,
例如:
{-# LANGUAGE CPP #-}
module MyModule (
main
#ifdef TEST
,functionUnderTest
,functionAlsoUnderTest
#endif
) where ....
对于阴谋集团,.cabal中的下列设置似乎可以工作:cpp-options: -DTEST可以用堆栈来再现这个设置吗?
在大多数功能语言(包括Haskell )中,定义链接列表类型本身是简单的:
data List a = Nil | Cons a (List a)
但是,我在Haskell教程中找不到显示如何定义自己的数组类型的教程。如何定义数组数据类型,就像我们从无到有地定义自己的列表一样?
Note:我的问题不是如何在Haskell中使用数组,而是理论上如何定义自己的数组类型,就像为List所做的那样,而不使用任何类型的库或内置功能。
haskell很容易遇到一个非常常见的问题。描述它的代码片段是这样的:
data JobDescription = JobOne { n :: Int }
| JobTwo
| JobThree { n :: Int }
deriving (Show, Eq)
taskOneWorker :: JobDescription -> IO ()
taskOneWorker t = do
putStrLn $ "n: " ++ (show $ n t)
main :: IO ()
m
我可以在带有约束的数据类型上使用makeLenses模板吗?如果可以,如何使用?我不想读任何关于的文章。
在GHC中,我有一个例子:
{-# LANGUAGE TemplateHaskell, FlexibleInstances, UndecidableInstances, NoMonomorphismRestriction #-}
module Main (main) where
import Control.Lens
import Control.Monad.Reader -- mtl
class Class1 a where
someThing :: a -- just
我试图使用reflex和reflex-dom安装cabal install,我收到了以下错误消息:
$ cabal install reflex-dom
...
cabal: The following packages are likely to be broken by the reinstalls:
lens-4.15.1
ghcjs-0.2.0
free-4.12.4
kan-extensions-5.0.1
adjunctions-4.3
Use --force-reinstalls if you want to install anyway.
ghcjs on GitHub在的
举个例子,我有一辆自行车,有前轮和后轮,两者都有一个Int来表示直径。
type Wheel = Int
data Bike = Bike { frontwheel :: Wheel, rearwheel :: Wheel }
deriving (Show)
mybike = Bike 24 26
现在我想更换一个轮子,因为我不喜欢它们大小不同:
replaceFrontWheel :: Bike -> Wheel -> Bike
replaceFrontWheel bike wheel = bike { frontwheel = wheel }
repairedbik
这是在Haskell中使用拉链的一个例子:
data Tree a = Fork (Tree a) (Tree a) | Leaf a
data Cxt a = Top | L (Cxt a) (Tree a) | R (Tree a) (Cxt a)
type Loc a = (Tree a, Cxt a)
left :: Loc a -> Loc a
left (Fork l r, c) = (l, L c r)
right :: Loc a -> Loc a
right (Fork l r, c) = (r, R l c)
top :: Tree a -> Loc
我想尝试一些新的东西,所以我决定把头绕在哈斯克尔身上。我主要来自C#/Java背景,我有一个关于更新各种值的问题。我设法把它缩小到一个问题上。考虑以下职能:
appendHistory :: State -> Action -> State
appendHistory (State gs p1 p2 h) a = State gs p1 p2 (a : h)
这基本上是将这一行动附加到国家历史上。在这种情况下,gs、p1和p2是不相关的,因为我们试图更新h。为了复制变量,它们需要命名(所以我可以在=的右侧使用它们)。我是否可以编写appendHistory,这样h就可以得到更新,而
今天,在“镜片函数式编程的冒险”中,我们的英雄试图在列表元素上定义一个棱镜,这个元素可能存在也可能不存在。
这是一个有点棘手的解释,因此,为了避免X,Y问题,我将给实际用例的所有荣耀。
我正在用Haskell编写一个名为的文本编辑器,整个想法是它是非常可扩展的,这意味着大多数功能都是作为扩展编写的。由于扩展是一个核心原则,扩展也依赖于其他扩展,所以我需要一种集中存储它们的状态的方法,这样依赖于扩展的所有扩展都可以访问其当前的“扩展状态”。当然,编辑器的核心并不知道这些状态的类型,因此目前我正在存储一个值列表。当扩展存储它转换为动态的状态时,稍后可以通过如下所示的棱镜提取它:
data Stor