Haskell 三元树中的串联列表

我正在制作一个函数,使用累加器连接列表的三元树 19 data Ttree t = Nil | Node3 t (Ttree t) (Ttree t) (Ttree t) 20 21 acc :: Ttree [a] -> [a] 22 acc tree = acc' tree [] 23 24 acc' :: Ttree [a] -> [a] -> [a] 25 acc' Nil rest = rest 26 acc' (Node3 xs l m r) r

Haskell:多态函数解释

所以我得到了这个 intCMP :: Int -> Int -> Ordering intCMP a b | a == b = EQ | a < b = LT | otherwise = GT intCMPRev :: Int -> Int -> Ordering intCMPRev a b | a == b = EQ | a < b = GT | otherwise = LT floatCMP :: Floa

Haskell 概述,但在函数式编程方面非常复杂

在函数式编程中,一个非常通用的函数是什么样子的 有人说“我们没有对象,但我们有高阶函数”。高阶函数是否替换对象 在编写面向对象的应用程序时,我多次尝试从一个更一般的想法转到一个更详细的想法。如果我在函数式编程中尝试这样做,我会需要很多高阶函数吗?这个答案是面向Haskell而不是Lisp的,因为尽管Lisp有高阶函数,但惯用Lisp可以而且通常非常面向对象 我们还将忽略继承(和特殊多态性),这通常与面向对象编程相关,但在某种程度上是正交的 一般来说,抽象数据类型“替换”对象,也就是说,通常在Ja

Haskell为树增加价值

我想做一个函数,如果给定路径上的值等于ND(无数据),我可以向树中添加一个新值,这是我第一次尝试 它检查值等,但问题是,我想能够打印修改后的树与新的数据。有人能给我指点吗?我还试着做了第二个函数来检查路径,看看是否可以添加数据,但我只是不知道如何打印修改后的树?我不是Haskell方面的专家,但函数编程只适用于函数。所以任何东西都是函数。 现在,函数接受一些输入并返回一些内容,而不是修改输入。您必须将返回的树保留在某个位置,这将是您的新树,其中包含插入元素的树我们确实需要查看路径和错误数据类型来

Haskell:无法编译该程序

我无法编译以下代码: main = do line <- getLine putStrLn (work (toInt line) [0,0,0]) work n b = do if n == 0 then unwords (map show b) else do line <- getLine work n-1 summ (map toInt . unwords line) b toInt ::

参数化haskell数据类型中元组的长度

我想这样做: data Foo n = Foo $(tuple n Integer) 从而允许 x :: Foo 3 x = Foo (1, 2, 3) y :: Foo 5 y = Foo (5, 4, 3, 2, 1) 目前我只是 data Foo = Foo [Integer] 可以使其工作,但会丢弃许多良好的编译时检查。我将创建几个不同的Foo数据对象,每个对象在其整个生命周期中都有固定数量的Foo,如果不能在类型系统中检查这一点,那就太傻了 这在哈斯克尔可能吗?怎么样 data

Haskell 使用修改的元素修改并返回列表

我试图修改数据库列表中的一个元素以添加到评级中,我想返回一个包含新元素的修改后的数据库。我知道哈斯凯尔有不可改变的东西,但同时我也不太明白怎么做 以下是类型: data Film = Film Director Title Year Ratings deriving (Show,Ord,Eq, Read) testDatabase :: [Film] 我仅有的代码是: --addRating :: Rating -> Film -> Film --addRating r

Haskell 如何限制异构列表中的类型?

我目前正在尝试创建一种嵌入Haskell的(某种)类型安全的xml语法。最后,我希望实现这样的目标: tree = group [arg1 "str", arg2 42] [item [foo, bar] [] ,item [foo, bar] [] ] data Bar = Bar Int | DefaultBar example = Group (StringArg "str") (IntArg 42) [I

Haskell将IO a转换为m a

我想把一个一元值转换成另一个一元类的一元值 假设我有一个实例声明: instance ClassM TypeT where funcX = abc >>= \x -> return (x) ClassM:是一个自己定义的monad类 TypeT:是一种自己定义的类型/数据,具有monad实例实现 abc:属于IO a型 如何转换abc::IO a的一元值 到classM m=>MA的一元值 又称m1 a->m2 a(其中m1不是m2)(例如:IO 5-

Haskell 从“获取价值”;IO a";被解释为列表

我在和哈斯克尔学习 这是签名。解决问题的办法是: sequenceIO :: [IO a] -> IO [a] sequenceIO [] = return [] sequenceIO (a:as) = do {v <-a ; vs <- (sequenceIO as) ; return (v : vs)} sequenceIO::[IO a]->IO[a] sequenceIO[]=返回[] sequenceIO(a:as)=do{v你的解决方案不起作用的原因是你不能简单地

haskell-检查R^2中的两点

我提出两点。 现在,我需要检查这些点是否相同,所以我要: type datatypePoint = (Float,Float) anyLine :: datatypePoint -> datatypePoint -> datatypeLine anyLine a b = [[fst a, fst b] , [snd a, snd b]] | (fst a == fst b) && (snd a == snd b) = error "Identical"

Haskell 阴谋集团-接口文件版本不匹配(通缉“7063”,获得“7042”)

我已经升级到ghc-7.6.3,现在我很难安装阴谋集团,它在接近尾声时就失败了。模块使用ghc编译并正常运行 错误是: 阴谋集团:错误的接口文件:dist/build/Sync.hi 接口文件版本不匹配(通缉“7063”,通缉“7042”) 我们将不胜感激 谢谢 N 更新: 感谢您的建议-错误实际上更简单。出于某种原因,我注释掉了文件顶部的模块声明——因此build/dist目录中只有名为Main not Sync的文件。我想知道这些错误消息是否能说明这一点 以下是cabal安装-v的输出:

Haskell 自己的复制项实现

我想知道是否可以为Bool编写自己的replicItem实现 没有导入Monad模块的值?当我查看Haskell源代码时,它看起来确实很复杂,但我想知道该函数是如何工作的,它应该是什么样子。实现replicateM的一种方法是: replicateM n = sequence . replicate n 这有助于你的理解吗?当然,棘手的部分在于序列的操作,它有以下有趣的类型: sequence :: Monad m => [m a] -> m [a] 因此, replicateM

Haskell 为什么mingw32和tdm-gcc64在使用外部gcc时表现不同

我正在尝试cabal安装wxHaskell的一个组件(Haskell平台2013.2与wxWidgets 3.0)。 我能够从mingw.org用32位mingw编译git版本。但最终,安装的wx无法正常工作,运行一个最小的示例会在wxc.dll中出现运行时异常。因此,我尝试在TDM-GCC4.8.164bit下编译相同的东西,因为wxWidgets人员以TDM-GCC编译的二进制文件的形式提供二进制文件 但我告诉我,TDM-GCC立即遇到了编译错误 错误:“strnlen”未在此作用域中声明

Haskell中带参数的函数

我正在尝试编写一些在haskell中具有参数的函数 例如:我创建了一个包含各种颜色的列表,但我希望函数只从列表中获取橙色,如何在函数中指定此颜色 getColor :: a -> a getColor = orange 您需要一个函数,该函数接受多种颜色的列表并返回单一颜色(可能是您自己选择的)。您应该从表示颜色的数据类型开始 data Colour = Red | Orange | Yellow | Green | Blue 现在,您需要一个具有以下类型的函数getcolor get

Haskell 凯特没有捡到新的包裹

我正在尝试使用Keter部署Yesod应用程序。我以前在/opt/keter/incoming中添加了一个*.keter捆绑包,但由于我在不同的系统上构建了该文件,因此无法启动。此后,我通过在服务器上构建我的应用程序来解决这个问题 但是,现在当一个新的*.keter包被添加到/opt/keter/incoming/时,什么也不会发生/opt/keter/log/keter/current.log自第一次部署失败后,没有任何日志消息。当我运行ps aux | grep kete[r]时,我看到几个

Haskell 定义Get和put

对于学校编程练习,我被要求在modify方面实施get和put,在get和put方面实施modify。因此,我一直在困惑几个堆栈溢出的职位和其他材料,以把碎片在一起。这就是我到目前为止所做的 class Monad m => MonadState m s | m -> s where get :: m s get = modify id -- (\s -> s) put :: s -> m () put s = do

Haskell 多态性自我应用

我有一个我不太了解的System F plymorphism的例子: 如果我删除这些类型,它将保留: \f、 \a.f(f a)这毫无意义 你能帮我吗? 谢谢大家! 删除的术语确实有意义:在Haskell中,它将是\f a->f(f a),一个相当普通的函数,将其第一个参数应用于第二个参数,然后再应用于结果 \f a->和\f.\a之间的区别只是其中一种表示法。如果愿意,可以编写Haskell术语\f->\a->f(fa),它是等效的,但在语法上更接近已擦除的系统f (请注意,double不是

Haskell Can';不匹配foldl内部的元组

我有下面的代码,应该是™ 将excel列类型转换为相应的编号。例如,AA分为27,AB分为28: import Data.Char (ord) import Data.List (foldl1') columnToNumber :: String -> Int columnToNumber s = foldl1' (\acc (i, v) -> acc + 26 ^ i * v) (values s) where values s = zip (reverse [0..(len

Haskell 调用一个实例";方法“;在哈斯克尔

我正在阅读《Haskell从第一原理编程》一书,在其中一个建议的练习中,作者要求我们编写一个类TooMany for(Num a,TooMany a)=>(a,a)的实例,如果两个数字之和大于42,则应进行比较 这是我的密码: class TooMany a where tooMany :: a -> Bool instance TooMany Int where tooMany n = n > 42 instance (Num a, TooMany a) =>

Haskell 比较两个列表中的元素

我在Haskell做作业,我需要一个元素一个元素地比较两个列表,并计算有多少元素是相同的,在同一个地方:第一个列表的第一个元素和第二个列表的第一个元素,等等 以下是我所拥有的: compare :: [Int]->[Int]->Int compare [a] [b]= if head a == head b then 1 + compare (tail a tail b) else 0 + compare (tail a tail b) compare [] [b] = 0 我事

Haskell 检查列表中的所有元素是否与参数匹配

我想做一个函数,检查每一行的电路板是否是红色的,一次一行,但从概念上讲,我很难做到这一点。起初,我用所有蓝色方块制作电路板,但一旦用翻转功能翻转方块,allRed功能应该能够判断行是否全部为红色。每一行由蓝色或红色的颜色列表表示 我知道我应该使用all函数,但我在实际编写时遇到了一些问题 以下是我到目前为止的情况: generateboard :: Int -> [[Color]] generateboard n = replicate n (replicate n Blue) all

Haskell 谷歌+;登录时API没有响应

我正在一个网站上工作,为了省去私人数据库的麻烦,我决定使用GoogleAPI对用户进行身份验证。我跟着导游走。我复制了代码,但当我运行它并尝试登录时,我会在谷歌屏幕上选择要登录的帐户。我选择了我的账户,然后它持续加载了很长一段时间(我把它保留了半个小时,没有任何变化)。此外,应用程序开始消耗我的ram(它使用我16GB的所有内存) 我不确定哪里出了问题。也许以前有人遇到过这种事 干杯 编辑: 以下是我使用的代码: {-# LANGUAGE MultiParamTypeClasses #-} {-

在Haskell中多次运行函数

我以前创建过这个函数来生成范围(m,n)内的整数和随机数 在这种情况下,我希望使用相同的参数多次运行它,这样它将返回给定范围内随机生成的值列表。我尝试了复制函数,但它只复制了giveRand的结果。它没有创建函数的多个副本并重新评估它 从这个问题中,我想知道是否有一个函数允许我使用相同的参数多次运行任何函数。我问这种情况,比如这个,即使输入相同的范围,可能会出现不同的值 那么,Haskell中是否有任何函数可以让我使用相同的参数多次运行函数?忘记unsafePerformIO;承认你在做有状态的

定义数据类型后,如何在Haskell中使用它们?

我为一副牌定义了数据套装和数据值。我还定义了类型Card和类型Deck。但我不知道如何使用它们 data Suit = Club | Diamond | Heart | Spade data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen | King | Ace type Card = (Suit, Value) type Deck = [Card] 有人能给我

Haskell 定义与图表对应的Tree类型的值

遵循此树数据类型的定义 data Tree = Leaf Int | Node Int Tree Tree 定义与图表对应的Tree类型的值 0 1 2 3 4 5 6 t:树 t= 我对构造函数叶与节点有些困惑。以及问题的确切结构。有一个构造函数节点创建了一个有两个树分支的节点,还有一个只创建了一个叶节点,对吗?这是否意味着在我们的定义中,使用“leaf”的唯一时间是在末尾,而在开始时调用node t = Node '0' (Node '

Haskell 即使我的应用程序没有';T

我想知道使用大量交换空间运行ghc是否是个好主意,或者是否可行。我的工作负载中,大部分数据99%的时间处于空闲状态。在任何给定的时间,实际上都在积极使用一组非常小的数据。这听起来是让内核交换内存的最佳时机,但gc通常是个问题。不过,Haskell只有不可变的值,所以理论上它可以工作 ghc运行时是否读取旧值,迫使我在每个gc或其他东西上交换入/出,或者我是否可以期望不接触的内存不会被交换入 请随意编辑标题,我想不出一个合适的描述。GHC使用复制采集器,将活动/可访问数据树复制到一个新区域,这意味

Haskell 不正确地使用foldM和IO[Bool]进行arg解析

我是Haskell的新手,我正在尝试映射一个检查函数,该函数检查文件是否存在,如下所示: check::FilePath->IO Bool 从Main到argv,如下所示: main :: IO Bool main = do { args <- getArgs; return $ foldM (&&) True $ mapM check args; } main::IO Bool main=do{ args Bool->m0 Bool 实际类型:Bool-

使用Haskell读取OBJ文件

我正在尝试使用波阵面obj包来读取obj文件。这是 下载此文件后,我会 import Data.WaveFrontObj x <- loadWavefrontObj "pinecone.obj" 然后: 看起来结果是空的。我做了什么坏事?看起来你的OBJ文件有一些波前OBJ无法识别的指令。您可以看到,波前obj只理解、v、vt、vn和f指令。您的文件以mtllib和o指令开始,并且似乎有几个其他指令不在支持列表中 因此,先验地,我希望得到的结果是左而不是右。但是波阵面obj的作者陷入了一

Haskell-具有两个参数的typeclass的翻转参数

我有一个multiparam typeclass,它提供了一个函数,可以交换其参数: class Swappable a b where swappable :: a -> b -> Bool 因此,如果a和b形成可交换的ab,那么b和a应该形成可交换的ba。为每个普通实例编写一个交换实例将是一件烦琐的事,所以我天真地写了 instance Swappable a b => Swappable b a where swappable b a = swappab

Haskell 每当我尝试安装某些东西时,堆栈抛出错误

每当我尝试使用堆栈安装某些东西时,例如$stack install hip,$stack install Gifcurry,以及其他几个软件包,它们都会抛出相同的错误: Downloaded lts-12.9 build plan. AesonException "Error in $.packages.cassava.constraints.flags['bytestring--lt-0_10_4']: Invalid flag name: \"bytestring--lt-0_10_4\""

使用列表理解的Haskell中的全组

我对Haskell(和编程)很陌生。 我的任务是定义一个函数,它返回一整副卡片(又称52张卡片)。试图在代码旁边的注释中包含我的思维过程 --我定义的值 data Suit = Club | Diamond | Heart | Spade deriving (Show, Enum) data Value = Two | Three | Four | Five | Six | Seven | Eight | Nine | Ten | Jack | Queen

为什么(-2)与Haskell中的(\x->x-2)不同?

我正在自学Haskell使用CIS194spring13。今天,当我试图处理作业4练习1时,我犯了一个错误 fun1' :: [Integer] -> Integer fun1' = foldl' (*) 1 . map (-2) . filter even 据说: error: ? No instance for (Num (Integer -> Integer)) arising from a use of syntactic negation

Haskell 哈斯克尔型解释

我不理解下面代码的简单类型错误 addCustom :: Num a => a -> a addCustom a = a + 1.2 它抛出 无法从文字“1.2”推导出分数a 我不知道为什么 您必须将分数a添加到a的上下文中 应该有用 如果启动ghci并查看1.2的类型,您将看到 (1.2) :: Fractional p => p 而+的类型是 这表示该函数可以应用于属于类型类Num的对象 因此,虽然a->a是函数的类型,但它没有分数上下文。仅限Num 这就是为什么添加上

Haskell 在使用Nix';s callCabal2nix

当前我的default.nix看起来像: { sources ? import ./nix/sources.nix , compiler ? "ghc865" } : let niv = import sources.nixpkgs { overlays = [ (_ : _ : { niv = import sources.niv {}; }) ] ; config = {}; }; pkgs = niv.pkgs; myHaskellP

Haskell submonand泄漏(blaze html空输出,格式为u3;)

我正在用blaze html库编写一个web应用程序。 静态内容生成时没有问题,但我坚持生成动态内容 -- compiles, runs but expanded into empty string forM_ [1,2,3] (\x -> return $ (H.p . H.toHtml . show) x) 看来这次bug潜入了Haskell类型检查器 我的调查 :t forM_ forM_ :: (Foldable t, Monad m) => t a -> (a -

Haskell 二叉树集合的foldr

如何为具有签名的集合实现foldr函数: (a -> b -> b) -> Set a -> b -> b 而不是 (a -> b -> b) -> b -> Set a -> b 在哪里 data Set x=Node | Tree x(Set x)(Set x)您可以根据原始函数定义新函数(请注意,这不是特定于Set;这适用于具有可折叠实例的任何类型构造函数) 换句话说,新函数就是由foldr组成的flip与其他签名的组成方式相

Haskell用我的状态单子标记二叉树的节点不起作用

到目前为止,我编写了以下代码,我测试了所有函数,它们工作得很好,但是测试indexNodesM函数,它就是不工作,我认为put方法工作不正常 给定的测试用例是: execState (indexNodesM exTree1) 0 == 6 evalState (indexNodesM exTree1) 0 == Node (5,3) (Node (3,1) Leaf (Node (2,11) (Node (0,7) Leaf Leaf) (Node (1,5) Leaf Leaf))) (Nod

Haskell-检查列表中的任何字符串是否在字符串中

我在寻找本质上与此相反的东西,我已经疯了 在字符串中,可以反转下面的参数来检查列表中的任何元素 而不是: any(isInfixOf“Hask”)[“我是”、“新来的”、“Haskell”] 我需要: any(isInfixOf[“我是”、“新来的”、“哈斯克尔”)“我是新来的” 感谢您的帮助 您可以使用lambda表达式将其编写为: any (\x -> isInfixOf x "I am new to") ["I am", "new t

Haskell boolen表达与副作用

我希望每个人都安全 我正在学习Haskell,发现Haskell中的函数没有副作用。我只是想知道在命令式语言中,布尔表达式被认为是没有副作用的表达式,因为它们只返回true或false(它们的主要作用) 谢谢 在命令式语言中,表达式通常会有副作用。例如,在Python中: def f(x): print(x) return True if f(2) or f(4): print(3) def(x): 打印(x) 返回真值 如果f(2)或f(4): 打印(3) 因此,它在

本地依赖项导致VSCode的Haskell扩展中出现错误消息

我正在尝试将和repos结合起来,以便能够更改这两个版本的源代码,同时具有针对VSCode的Haskel扩展的优点(关于hover和autocomplete的文档) 我在回答我的问题时使用了我自己描述的两种方法。我能够使用pandoc类型作为本地依赖项,使用cabal build和stack build成功编译我的代码 如上面链接中所述,为了向堆栈项目添加本地依赖项,需要更改以下文件: flags: pandoc: trypandoc: false embed_data_fi

Haskell如何执行Beta转换以派生类型?

我正在通过锻炼来学习哈斯克尔。我的路有个街区。我不知道Haskell是如何推断出lift2()(,)的类型,并得出函子k=>(a1->ka2)->a1->k(a1,a2) 我已经试用了lift2()的类型,并通过GHCI的命令:t lift2()进行了验证。步骤如下。 我知道lift2::Applicative k=>(a->b->c)->ka->kb->kc 我还知道:函子f=>(m->n)->(fm)->(fn) 然后通过lambda演算的Beta转换,我可以计算出lift2()的类型是 (

Haskell 安装、v1安装、v2安装和新安装之间有什么区别?

命令install、v1 install、v2 install和new install在运行man cabal时被简单描述为“安装软件包”。它们彼此不同吗?哪个是首选选项?对于cabal安装的版本,是相同的v1安装和其他v1-命令已过时,不应再使用 请注意,在开发cabal软件包时,install命令基本上是不必要的。正在运行并将自动安装所需的依赖项(在的部分中列出) 阴谋集团安装在以下情况下仍然有用: 从包安装可执行文件。与包中的warp可执行文件类似。在这些情况下,选项--overwrit

(Haskell)试图在数据上派生Show类。程序在编译时发出警告,然后在运行时侵入所有RAM。原因是什么?

尝试在Haskell中的用户定义数据上派生show时,出现内存不足错误。原因是什么 --ghc 8.0.2 class X a where f::a->a f a = a data T = AA | BB instance X T instance Show T var::T var = AA main = print $ var 我从Haskell那里期望制作X级和Show级的T instacne,并因此打印AA。实例函数在类X(实例X T)上工作,但在