所以我正在努力教自己Haskell.我目前正在第11章" 了解你是一个好的Haskell",我正在做99个Haskell问题以及项目Euler问题.
事情进展顺利,但每当我需要跟踪"变量"时,我发现自己经常做一些事情.我只是创建另一个函数,接受那些"变量"作为参数,并根据情况递归地提供不同的值.举一个例子来说明,这是我对项目Euler的问题7的解决方案,找到第10001个素数:
answer :: Integer
answer = nthPrime 10001
nthPrime :: Integer -> Integer
nthPrime n
| n < 1 = -1
| otherwise = nthPrime' n 1 2 []
nthPrime' :: Integer -> Integer -> Integer -> [Integer] -> Integer
nthPrime' n currentIndex possiblePrime previousPrimes
| isFactorOfAnyInThisList possiblePrime previousPrimes = nthPrime' n currentIndex theNextPossiblePrime previousPrimes
| otherwise =
if currentIndex == n
then possiblePrime
else nthPrime' n currentIndexPlusOne theNextPossiblePrime …
Run Code Online (Sandbox Code Playgroud) 所以这里已经存在这个线程,其中有一个示例,它创建了与其余页面不同的第一页头.我可以下载这个例子并运行正常.
当我试图模仿这个例子时我不能这样做(澄清:在将源代码改为我自己的源数据库之后,标题不会正确改变).最后,我开始将报告的各个部分复制到样本中,以查看触发问题的原因(澄清:我一次一步地删除了报告与示例之间的差异,以确定导致的确切差异问题).它最终成了我的桌子.
由于某些原因,我无法解释我是否添加了自己的新数据集,使用示例数据库删除表并使用我的数据集添加表,它将无法工作.当我说它不起作用时,我的意思是每个页面上的标题都是相同的,并且不会像预期的那样改变后续页面.
如果我运行调试器并在脚本上放置一个断点来强制显示不同的第一页和其他页面内容(如下所示),而不是使用示例数据库表,则会在每个页面上调用onRender事件...但是与我的表一起只调用一次.这导致母版页在开始时只检查onRender脚本一次,当pageNumber变量= 1时.我已经在这里工作了几个小时,我真的很想有人知道为什么会这样帮助我.
这是代码:
if( pageNumber > 1 ){
this.getStyle().display = "none";
}
Run Code Online (Sandbox Code Playgroud)
非常感谢您的帮助和知识,
-Asaf
你好StackOverflow社区,
我正在尝试安装一个perl模块,IO :: All.但每次我使用CPAN安装许多perl模块(包括我在cpan中运行"安装Build :: CPAN")它都会失败
无法在@INC中找到strict.pm(@INC包含:/dev/null/lib/perl5.8-dist/Linux-2.6c2.5-x86_64-64int /dev/null/lib/perl5.8-dist /dev/null/lib/perl5.8-dist/Linux-2.6c2.5-x86_64-64int /dev/null/lib/perl5.8-dist /dev/null/lib/perl5.8-dist.)at Build.PL第2行.
这让我困惑了好几个小时.我用Google搜索,似乎无法找到解决方案.运行类似的东西
perl -e 'use strict; print "ok"'
Run Code Online (Sandbox Code Playgroud)
输出就好了.我试图运行的原始文件,要求IO :: All也使用严格.怎么严格甚至失踪?默认情况下不是perl的严格部分吗?/ dev/null在哪里?这不是一个特殊的位置,你可以传入stderr/stdout,如果你不关心它?我已经把头发拉了一段时间.我一定错过了一些明显的东西.
这是在Rhel5虚拟机Linux-2.6-x86_64变体上运行的.
非常感谢您的帮助.如果我需要提供更多信息,请与我们联系.
谢谢,-Asaf
所以我意识到这是一个可能重复的问题,因为在Stack Overflow上报告了许多错误,但没有一个解决方案似乎适用于我的问题.
所以我有以下功能:
elementAt' :: Integral b => [a] -> b -> a
elementAt' [x:_] 1 = x
elementAt' [x:xs] y = elementAt' xs yminus1
where yminus1 = y - 1
Run Code Online (Sandbox Code Playgroud)
如果您想知道99 Haskell问题中的问题3 .该函数的目标是将列表和索引作为输入,并返回该索引处的值(从1开始).我不想解决这个问题,如果我这样做,我可以看看提供的解决方案.但我收到一个我不明白的错误.我正在使用eclipseFP,它是haskell的eclipse插件,它强调了函数的"[x:_]"和"[x:xs]"部分,并出现以下错误:
Couldn't match type `a' with `[a]'
`a' is a rigid type variable bound by
the type signature for elementAt' :: Integral b => [a] -> b -> a
Run Code Online (Sandbox Code Playgroud)
在讨论这个错误的所有线程中,我已经看到问题通常发生在有人试图将错误的输出提供给需要某种类型的东西时.例如,将某些东西(Int类型)的长度返回到应该是"Num a"变量类型的长度.
但在我的情况下,我甚至没有提供变量a的类型.它应该可以是任何东西,对吧?那我为什么会收到这个错误呢?如果我理解为什么我得到错误我可以解决它,但我只是不明白.
有人可以向我解释为什么我收到这个错误?
非常感谢您的帮助,谢谢.-Asaf
编辑:到目前为止提供的每个答案都是正确的,谢谢大家提供的有用信息.我要选择一个我认为最清楚的那个(我必须等5分钟才能完成).
所以我正在按照教程学习一个Haskell的好东西!到目前为止,我绝对喜欢Haskell.但是在本教程中提到的一个函数中,我收到一条警告,即if语句是多余的.
编辑:让我说清楚,函数的意图是完全按照elem函数的工作方式(默认情况下提供的Haskell).
这是原始功能:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y ys = foldl (\acc x -> if x == y then True else acc) False ys
Run Code Online (Sandbox Code Playgroud)
最初有两个警告,一个是eta减少,所以我从函数名称的开头和结尾删除了ys到达:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y = foldl (\acc x -> if x == y then True else acc) False
Run Code Online (Sandbox Code Playgroud)
现在我尝试将函数减少到以下,它会导致错误:
elem' :: (Eq a) => a -> [a] -> Bool
elem' y = foldl (\acc x -> x == …
Run Code Online (Sandbox Code Playgroud) haskell ×3
birt ×1
cpan ×1
header ×1
if-statement ×1
imperative ×1
install ×1
master-pages ×1
module ×1
perl ×1
types ×1
variables ×1
warnings ×1