我有两个Haskell函数,这两个函数看起来都非常相似。但是第一种方法在无限列表中失败,第二种方法在无限列表中成功。我已经花了几个小时试图弄清楚这到底是为什么,但没有用
这两个片段都是Prelude中“words”函数的重新实现。这两种方法都可以很好地处理有限列表
以下是不处理无限列表的版本:
myWords_FailsOnInfiniteList :: String -> [String]
myWords_FailsOnInfiniteList string = foldr step [
这只是一个假设的场景来说明我的问题。假设有两个线程,它们之间共享一个TVar。在一个线程中,有一个读取TVar的原子块,需要10秒才能完成。在另一个线程中,是一个原子块,它每秒修改TVar。第一个原子块会完成吗?当然它会一直回到开始,因为日志永远处于不一致的状态 不,可以。这两个线程的交互方式取决于
重试逻辑
例如,假设您有:
ten tv = do
n <- readTVar tv
when (n < 7) retry
writeTVar tv 0
-- do so
我刚刚编写了以下两个函数:
fand :: (a -> Bool) -> (a -> Bool) -> a -> Bool
fand f1 f2 x = (f1 x) && (f2 x)
f_or :: (a -> Bool) -> (a -> Bool) -> a -> Bool
f_or f1 f2 x = (f1 x) || (f2 x)
它们可用于组合两个布尔函数的值,例如:
import Text.Pars
标签: Haskell
definitionlazy-evaluation
我经常读到,懒惰与不严格不一样,但我发现很难理解两者的区别。它们似乎可以互换使用,但我知道它们有不同的含义。我希望有人能帮助我理解其中的差异
我有一些关于这篇文章的问题。我将在这篇文章的最后总结这些问题。我有几个示例片段,我没有测试它们,我只是将它们作为概念呈现。我添加了引号以避免您查找它们。也许这会在以后的问题上对其他人有所帮助
非严格定义:
函数f被称为严格函数,当应用于非终结符时
表达式,它也无法终止。换句话说,f是严格的
如果f bot的值为|。对于大多数编程语言,所有
功能是严格的。但
我定义了很多函数(比如100+),每个函数都做特定的工作,但签名相同。这有点像:
module R001 (run) where run = <do-...>
module R002 (run) where run = <do-...>
但是随着n的增长,我必须不断地维护一个大列表
有什么方法可以使用TemplateHaskell定义大列表,或者在运行时根据需要加载相应的模块,而不必将每个模块分离到不同的共享库中
根据epsilonhalbe的回答,我做了一些研究:
我一直在试图通过在线书籍“向我学习哈斯克尔”
作者将应用型函子的行为描述为:能够从一个函子中提取函数并将其映射到第二个函子上;这是通过为应用程序类型类声明的函数实现的:
class (Functor f) => Applicative f where
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
class(函子f)=>Applicative f其中
纯::a->f a
我想从控制台读取包含特殊字符的字符串,如ö,ä,ü,µ。。。我试过:
做。。。
ts因为GHC6.12字符串在输入和输出中作为UTF8处理(或者根据您的语言环境设置使用其他编码)。因此,请确保您的语言环境设置为UTF8
您还可以通过支持许多其他语言环境约定和编码的包手动控制这些内容。您需要将stdin的编码设置为UTF8。对我来说,在Windows XP上,最初在GHCi中设置为CP437,在Mac上设置为UTF8
用hGetEncoding标准输入检查(System.IO),并用hGetEnc
我想在Haskell中创建一个简单的平均值(mean)函数,因此我在ghci中尝试了以下方法:
ghci> let avg xs = (sum xs) / (length xs)
它抛出以下错误:
No instance for (Fractional Int)
arising from a use of `/'
Possible fix: add an instance declaration for (Fractional Int)
In the expression: (sum
我加载了两个模块(如中所示的NecessaryModule1.hs和NecessaryModule2.hs)。现在我想卸载必需的module2.hs。然而,我在中发现了一个“unload”函数,但它在WinGHCi中不起作用。我收到的错误消息是:
>unload NecessaryModule2
<interactive>:1:1: Not in scope: `unload'
<interactive>:1:8:
Not in scope: data
我对Haskell还是个新手(断断续续地学习)。我想知道为什么Haskell没有literalData.Map构造函数语法,比如Clojure或Ruby中的Map/Hash构造函数语法。有什么原因吗?我认为,由于Haskell确实为Data.List提供了文本构造函数语法,因此应该为Data.Map提供一个文本构造函数语法
这个问题根本就不是关键问题。我只想通过答案了解更多关于Haskell的信息。与Clojure和Ruby不同,Haskell的有限映射是作为库提供的。这有一个折衷:例如,正如您
如果字符串仅包含ASCII值,或者您只对每个字符的最后八位感兴趣,则可以使用Data.ByteString.Char8.pack(或其惰性ByteString版本)将字符串转换为ByteStrings
main :: IO ()
main = do
let a = ("teeeeeeeeeeeeest","teeeeeeeeeeeest")
b <- app a
print b
将限定数据.ByteString.Char8导入为C
main::IO()
main
标签: Haskell
higher-rank-typesforall
此代码中所有s的用途是什么
class Monad m where
(>>=) :: forall a b. m a -> (a -> m b) -> m b
(>>) :: forall a b. m a -> m b -> m b
-- Explicit for-alls so that we know what order to
-- give type ar
我必须得到Haskell元组中的第n个元素。元组是这样的:
(3,5,“第1条”、“第2条”、“第3条”、“第4条”、“第5条”、“第6条”、“第7条”、“第8条”、“第9条”、“第10条”)。你能给我一个主意让我解决这个问题吗?
谢谢。您可以通过模式匹配来完成。就像可以匹配二值或三值元组一样,也可以匹配十值元组
let (_, _, _, _, _, _, _, _, _, x, _, _) = tuple in x
然而,很可能你不想这样做。如果您试图从元组中获取第n个值,那么几乎肯定使用
我想看看Nquiens项目是否可以通过短距离砍伐森林,
我使用的代码是
n = 8
nqueens 0 = [[]]
nqueens k = [p:q | p <- [1..n], q <- nqueens (k-1), safe p q k]
n=8
n队列0=[]]
nqueens k=[p:q | p你不需要只看核心。还有其他更有用的中间形式。来自文档:
使用调试标志-ddump siml stats查看触发了哪些规则。如果需要更多信息,则-ddump rule
如何在持久模式下进行原子升级
尚未找到使用持久API执行upsert、insert或update操作的方法。类似insertBy之后的更新似乎是最接近的事情。但是,如果我没有理解错误,这将不是原子的,因此容易出现竞争条件。最新版本的persistent支持:
我没有答案,但这里有一些有用的事实可能会让你更接近——根据,一个runSqlite调用中的所有内容都是事务性的(这只是sqlite,但页面向我暗示,如果你翻转一个数据库并放入另一个数据库,这仍然是真的)。此外,upsert/merge似乎是
我在Haskell中开始了我的前几步,我试图将字符串转换为整数,但我没有做到这一点。我看过类似的问题,但我仍然不确定
我所要做的就是将例如'6'或“271”转换为整数,即分别是6或271。我该怎么做
类似的情况是,在Python中,我可以很容易地做到这一点:例如,int(“2723”)将完成任务。如果您知道字符串是有效的整数,或者如果不是这样,您不介意将其放大,则可以工作。如果您不熟悉Haskell的TypeClass,只需知道您可能必须告诉Haskell您想要阅读它的类型:
main :: I
为什么这是非详尽的,删除一个元素不意味着它最终应该停止吗
do_something :: [(String, String, Int)] -> String
do_something [(a, b, c)] = func(a, b, c) ++ do_something( drop 1 [(a, b, c)])
您必须在dou\u something声明中指定(String,String,Int)列表的每个大小写。您必须给出传递给do\u something的参数为空或包含多个元素时的定
Eclipse在explicit forall的编辑器中显示错误,尽管我可以无错误地运行脚本。我怎样才能解决这个问题?(当我在cmd中运行它时也会发生这种情况,我想我需要一个标志!)
另外,关于默认为整数类型的警告也很烦人,有没有办法阻止它们
您需要在每个文件中明确声明语言扩展名,如下所示
{-# LANGUAGE FOO #-}
其中,FOO是,ExplicitForall,让我们为所有编写,ScopedTypeVariables,这意味着您可以编写
foo :: forall a.
我试图将wxHaskell安装到运行WindowsXP64的机器上,使用gcc从源代码构建MinGW/MSYS和WxWidget3.0。我做到了:
cabal install wx
并得到一个错误:
...
Configuring wxc-0.90.0.4...
setup.exe: wx-config: does not exist
Failed to install wxc-0.90.0.4
cabal.exe: Error: some packages failed to install
在GHCI中,id的类型为:
Prelude> :t id
id :: a -> a
但是如果我定义自己的id函数,为什么类型变量t的名称是?t和a之间有区别吗
Prelude> let identity x = x
Prelude> :t identity
identity :: t -> t
a和t之间没有区别,它们被称为类型变量,代表您可以拥有的任何类型。请注意,它们是用小写字母编写的,而类型的开头是用大写字母编写的(列表除外,列表具有特殊语法)
此外,如
例如,没有自由变量的引用透明函数:
g op x y = x `op` y
A现在是一个具有自由变量的函数(从f的角度来看)op和x:
x = 1
op = (+)
f y = x `op` y
f在引用上也是透明的。但这是一个纯函数吗
如果它不是一个纯函数,那么一个引用透明但使用了一个或多个绑定在封闭范围内的变量的函数的名称是什么
提出这个问题的动机:
我不清楚这篇文章:
结果值不需要依赖于所有(或任何)参数值但是,它只能依赖于参数值。
(强调矿山)
也不是从搜索纯函数是否可以依赖于fr
我试图将一个多部分表单请求发布到一个内部网站,该网站应该用XML响应进行回复。使用Python中带有请求库的另一个简单脚本,一切正常,但是使用http导管,我不断收到一个异常ExpectedBlankAfter100Continue
如果我将内部url替换为“”,我还会收到一个没有问题的回复
我做错什么了吗?看起来要么是库中的bug,要么是站点的行为不符合预期。如果是后者,我是否可以选择在http管道中禁用此检查
示例代码:
{-# LANGUAGE OverloadedStrings #-}
我已经通读了。它给出了很多例子,但有些事情没有解释
例如,此实体定义中的Gt Desc是什么意思
-- Define our entities as usual
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
Person
firstName String
lastName String
age Int Gt Desc
deriving Show
|]
所有这些额外
我有一个总和类型的记录来表示所有内存中的表,因为我将通过网络发送它们。我有一个二进制协议,需要首先在头中传递序数值(fromnum),以确定数据与哪个表关联。问题是sum类型需要从Enum派生,但它不想这样做
data Table = MarketData {bid::[Float], ask::[Float]}
| Trade {price::[Float], qty::[Float]}
deriving Enum
main :: IO ()
main = do
标签: Haskell
statecontinuationsmonad-transformers
我有一个用haskell写的原始解释器。
此解释器可以正确处理return语句()
现在我想将全局状态添加到我的解释器中。
可以从全局代码或函数的代码更改此状态
(函数的代码使用runCont运行,以提供返回逻辑)
代码如下所示:
import Control.Monad.Cont
import Control.Monad.State
type MyState = String
data Statement = Return Int | GetState | SetState MyState
为什么要进行这种类型检查:
runST $ return $ True
但以下情况并非如此:
runST . return $ True
GHCI投诉:
Couldn't match expected type `forall s. ST s c0'
with actual type `m0 a0'
Expected type: a0 -> forall s. ST s c0
Actual type: a0 -> m0 a0
In the second
在haskell gchi中乘以5*-3会给出错误和错误。但是相乘5*(-3)可以正常工作。为什么需要括号
$ ghci
GHCi, version 7.4.1: http://www.haskell.org/ghc/ :? for help
Loading package ghc-prim ... linking ... done.
Loading package integer-gmp ... linking ... done.
Loading package base ... linki
我正在寻找一种简单的方法来创建一个图像,有可能设置单个像素的颜色,然后将此图像保存为png
我的目标尤其是根据内容生成的世界绘制地图。我想使用的算法要求我能够独立设置每个像素,希望每次设置像素时不必复制整个图像
使用Haskell以这种方式操作图像的最佳方式(如“最惯用的”)是什么?这是正确的工具,还是应该使用C库来实现
注意:当我阅读一些相关的问题时,他们关注的是更复杂的框架来创建整个游戏,这不是我的目标,我宁愿使用一些轻量级的在其他几个小时后,我找到了这种方法来绘制图像并将其保存为PNG
i
标签: Haskell
typeclasstype-constraintstype-families
在处理类型族时,通常可以方便地使用相等约束,以避免在签名中重复某些类型函数的名称:
class Foo f where
type BulkyAssociatedType f :: *
foo :: BulkyAssociatedType f -> f
...
bar :: forall m f b .
( Monad m, Foo f, b ~ BulkyAssociatedType f
, Monoid b, Monoid (m b)
我试图获得一个阴谋集团配置,相当于使用ghc-threaded-O2编译,然后使用my.exe+RTS-N4-s运行。目前我有
executable my.exe
ghc-options:
-O3
-threaded
-rtsopts
-with-rtsopts="-N4"
main-is: Main.hs
当我运行my.exe时,它会给我意外的RTS参数:-N4对于多个选项,请将整个字段置于引号中:
“-带rtso
有人在Windows 7上成功安装了gtk for haskell吗?我已经从网站下载并解压了GTK+-3的多功能捆绑包,将bin目录添加到我的PATH变量中,这样就可以找到pkg config并管理它来安装gtk2hs buildtools。cabal\bin目录也在我的路径中
然而,阴谋集团安装gtk失败
错误消息摘录如下:*缺少C库:gobject-2.0、glib-2.0、intl
GS我不确定,但这个错误意味着您缺少开发库。根据我的经验,cabal和所需的软件包存在问题,您需要将不同的
我曾在中为程序构建抽象语法树
使用,我得到如下输出
A.Module {
A.moduleName = "main",
A.moduleDataLayout = Nothing,
A.moduleTargetTriple = Nothing,
A.moduleDefinitions = [
...
A.GlobalDefinition A.G.Function {
A.G.linkage = A.L.External,
A.G.visibi
我在跟踪函数中的计数器变量时遇到了一些困难
我创建了一个函数,该函数将一个数字作为单个参数,递归地将该数字乘以2,将所有乘以2的数字相加,下面的代码更清楚地说明了我的意图:
sum :: Float -> Float
sum x = x + sum (2*x)
然而,我面临的困难是,我希望函数只递归十次。所以我希望它在十个数字相加后停止。我尝试使用计数器跟踪函数的递归次数,但没有效果
这就是我所尝试的:
sumTen :: Float -> Float
sumTen x n
我的困境是:
当Haskell程序被编译时,会生成可在物理CPU上执行的二进制可执行机器代码。当解释Haskell程序时,物理CPU对来自内存位置的数据执行操作。实际上,执行发生在某个时间段,其长度取决于CPU速度
由于数据是由确保每个变量都是强类型的编译器放入内存的,这是否意味着Haskell实际上有一个运行时类型
澄清:
我所说的“运行时类型”是指:当程序在物理处理器上执行时,语言编译器在语言编译时可以访问/识别的变量类型(在类型理论意义上) 任何编译程序中使用的“运行时类型”,无论源语言如
我需要在haskell中创建一个powerset函数,该函数获取一个集合并输出该集合,而无需重复输入,无论输入列表中放置了什么。例如:[1,1]应该返回[[],[1]]
powerset [] = [[]]
powerset (x:xs) = union((powerset xs)) (map (x:) (powerset xs))
其中union是一个先前定义的函数,它与两个集合相邻,没有重复项。上述代码的问题在于,它将重复项计为原始项,因此输入[1,1]返回[]、[1]、[
Im使用http管道获取网页
import Network.Connection (TLSSettings (..))
import Network.HTTP.Conduit
main :: IO ()
main = do
request <- parseUrl "https://somesites.com"
let settings = mkManagerSettings (TLSSettingsSimple True False False) Nothing
我已通过Parsec和Data.csv读取csv文件:
import Text.ParserCombinators.Parsec
-- package MissingH
import Data.CSV
import Data.Either.Utils
myFile <- parseFromFile csvFile path
现在我想在我的清单上做很多事情。
首先,我需要在它上面映射一个分割,因为我的csv是选项卡分隔的
如何从该类型结构中提取列表?
我已经找到了
导入数据。或者
fro
我有一个只包含两种元素的列表,Apple和Peach。我需要创建一个函数,给定一个包含这些元素的列表,通过递归返回列表中出现的Apple
以下是我的尝试:
数据水果=苹果|桃
findFruit::[Fruit]->Int
findFruit[]=0
findFruit(y:ys)
|y==苹果=1+(findFruit ys)
|否则=findFruit ys
但它不起作用。我怀疑问题在最后的说明中,但我不能真正理解在哪里,因为我仍然是Haskell的新手
以下是错误日志:
Main.hs:
我正在和初学者Haskell一起玩,我想写一个普通函数。这似乎是世界上最简单的事情,对吧
错
似乎Haskell的类型系统禁止average处理泛型数字类型——我可以让它处理积分列表或分数列表,但不能同时处理两者
我想:
average :: (Num a, Fractional b) => [a] -> b
average xs = ...
但我只能得到:
averageInt :: (Integral a, Fractional b) => [a] -> b
ave
标签: Haskell
refactoringparsecapplicative
我有一个关于重构代码以使用Applicative接口的问题。假设我有一个使用一元接口的解析器,如下所示:
filePath0 :: GenParser Char st Info
filePath0 = do
optional (string "./")
r <- artist
slash
l <- album
slash
t <- track
return $ Song r l t
filePath :: GenParser Char st Inf
当我从Leksah IDE(Win 7 64位系统上的0.16.2.2版)运行简约程序(如下所列)时,窗口会正确打开。但当从命令行启动Leksah生成的exe文件时,会打开另一个窗口,显示以下消息:
未找到入口点
在动态链接库libwinpthread-1.dll中找不到过程入口点pthread_cond_timedwait_relative_np
import Graphics.UI.Gtk
main=do
initGUI
window我从Hamishmack这里得到了这个答案:
在启动.ex
此函数用于查找第n个斐波那契函数
a = 1
b = 2
fibonacci :: Int -> Int
fibonacci 1 = a
fibonacci 2 = b
fibonacci n = (fibonacci (n-1)) + (fibonacci (n-2))
但是速度很慢。如果我把斐波那契[1..]映射到地图上,它会随着数字的到来而变慢。我猜这是由于使用了多少堆栈和计算的绝对数量造成的开销-将每一个堆栈向下进行a和b,而不是将最后两个堆栈相加
如何改进它,使其更快,但仍然
我有以下功能:
digits :: Int -> [Int]
digits n = go n []
where go num acc
| num < 10 = num : acc
| otherwise = go (div num 10) (mod num 10 : acc)
数字::Int->[Int]
数字n=转到n[]
去哪里
|num
我正在将Hedgehog与tasty discover一起使用,并编写了一个简单的类来实现二维坐标/向量。然后我编写了以下测试。唯一的问题是,它似乎只运行了一个测试,运行速度非常快,这让我相信这里有问题
如何让它运行10000次测试
module Spec where
import Test.Tasty
import Hedgehog
import Hedgehog.Checkers
import qualified Hedgehog.Gen as
这个话题之前已经讨论过了,所以我将链接到它
所以我确信它在当时起了作用,但时间变了:)
作为Haskell的新手,迈出一小步,这会让我更进一步。
我尝试了各种解决方案,解决了各种问题
建议的解决方案
instance Show a => Show (State a) where
show (State f) = show [show i ++ " => " ++ show (f i) | i <- [0..3]]
同样的问题也适用于信息:状态
class Monad m
信息:
从文档和教程中可以看出,默认情况下,“Haskell是懒惰的”
他们没有解释细节,我想知道
现在我知道如果我写:
filter odd [1, 2, 3]
在结果显示或用于表达式之前,它不会过滤结果
关于这一点,我有几个问题:
head函数是否懒惰
如果不是,为什么它不懒惰
如果是惰性的,Haskell编译器如何知道何时执行该函数
我举一个例子:
f a b = head a + head b
f [2, 3] [4, 5]
在这种情况下,从我的角度来看,头部将不返回2+4
它将
我在Haskell的“输入/输出重叠”一章中研究并行和并发编程,我不明白异步实际上是如何异步工作的
data Async a = Async (MVar a)
async' :: IO a -> IO (Async a)
async' action = do
var <- newEmptyMVar
forkIO (do r <- action; putMVar var r)
return (Async var)
-- if I desugar the do no
我希望下面的代码返回[LoadInt 1,LoadDub 2.5,LoadInt 3],但在解析[LoadInt 1,LoadDub 2]并面对.5,3后失败。我如何使它必须一直解析到逗号才能成功解析,而2.5上的int解析是失败的
import qualified Data.Attoparsec.ByteString.Char8 as A
import Data.Attoparsec.ByteString.Char8 (Parser)
import Data.ByteString.Char8
标签: Haskell
parametric-polymorphismtype-constructor
我正在学习Haskell,我在书中看到了这个奇怪的数据结构,它看起来是这样的:数据列表a=a:?:(列表a)| Nulo派生Show。据说这应该代表一个有序的列表,但我不认为我真的理解它。我的问题是,代码中“:”符号的含义是什么
我的问题是,:?:
这里定义的数据构造函数是:?:操作符。实际上,在GHCi中,您可以查询(:?:)函数的类型:
:t (:?:)
(:?:) :: a -> ListaOrd a -> ListaOrd
因此,这与您使用另一个名称完全相同,如:
dat
下面的代码以优化的方式工作,我很想理解它,但失败了。我明白第一行,但第二行我迷路了。如果有人能用C或Python来解释它,那将是一个很好的想法,甚至是一般的想法。多谢各位
combinations :: Int -> [a] -> [[a]]
combinations k xs = combinations' (length xs) k xs
where combinations' n k' l@(y:ys)
| k' == 0 = [[]]
| k' &
上一页 1 2 3 4 5 6 ...
下一页 最后一页 共 880 页