根据Monad Reader第8期中的文章,我使用功能依赖和类型系列编写了"Instant Insanity"拼图的类型级解决方案:
fundeps解决方案大约需要200秒.而类型族版本在大约800秒内完成.
是否有任何技术可以使类型族版本更有效地运行?
haskell ghc type-families functional-dependencies type-level-computation
我正在尝试编写代码以在Haskell中执行以下简单任务:使用此字典查找单词的词源,存储为大型tsv文件(http://www1.icsi.berkeley.edu/~demelo/etymwn/).我以为我会将tsv文件解析(使用attoparsec)到Map中,然后我可以根据需要使用它来高效地查找词源(并做一些其他的事情).
这是我的代码:
{-# LANGUAGE OverloadedStrings #-}
import Control.Arrow
import qualified Data.Map as M
import Control.Applicative
import qualified Data.Text as DT
import qualified Data.Text.Lazy.IO as DTLIO
import qualified Data.Text.Lazy as DTL
import qualified Data.Attoparsec.Text.Lazy as ATL
import Data.Monoid
text = do
x <- DTLIO.readFile "../../../../etymwn.tsv"
return $ DTL.take 10000 x
--parsers
wordpair = do
x <- ATL.takeTill (== ':')
ATL.char ':' *> (ATL.many' $ ATL.char ' ')
y <- ATL.takeTill (\x -> x `elem` ['\t','\n'])
ATL.char '\n' <|> ATL.char …Run Code Online (Sandbox Code Playgroud) 有没有一种方便的方法来编写一个试图匹配尽可能多的正则表达式的正则表达式?
例:
my $re = qr/a ([a-z]+) (\d+)/;
match_longest($re, "a") => ()
match_longest($re, "a word") => ("word")
match_longest($re, "a word 123") => ("word", "123")
match_longest($re, "a 123") => ()
Run Code Online (Sandbox Code Playgroud)
也就是说,$re被认为是一系列正则表达式,并match_longest试图匹配这个序列的多少.从某种意义上说,匹配永远不会失败 - 这只是一个匹配成功的问题.一旦正则表达式匹配失败,undef对于不匹配的部分.
我知道我可以编写一个函数,它接受一系列正则表达式并创建一个单一的正则表达式来完成工作match_longest.以下是该想法的概述:
假设你有三个正则表达式:$r1,$r2和$r3.执行该作业的单个正则表达式match_longest将具有以下结构:
$r = ($r1 $r2 $r3)? | $r1 ($r2 $r3) | $r1 $r2 $r3?
Run Code Online (Sandbox Code Playgroud)
不幸的是,这是正则数的二次方.是否可能更有效率?
有DBI没有办法确定SELECT语句的执行语句句柄是否将返回任何行而不从中获取?
就像这样:
use DBI;
...
my $sth = $dbh->prepare("SELECT ...");
$sth->execute;
if (..$sth will return at least one row...) {
...
} else {
...
}
Run Code Online (Sandbox Code Playgroud)
我想在$sth will return at least one row 不执行任何获取方法的情况下执行测试$sth.
注意 - 我不需要精确的行数(即$sth->rows),我只需要知道是否$sth->rows> 0.
(编辑:pipe下面的函数应返回一个受祝福的对象,以便重载正常工作.请参阅接受的答案.)
我正在尝试使用perl的overload功能来构建一个简单的解析树.我不需要太多 - 实际上,我只需要一个左关联的运算符.但是,perl解析$x op $y与更长链的解决方式似乎存在不一致$x op $y op $z op ....
这就是我所拥有的:
package foo;
use overload '|' => \&pipe,
"**" => \&pipe,
">>" => \&pipe;
sub pipe { [ $_[0], $_[1] ] }
package main;
my $x = bless ["x"], "foo";
my $y = bless ["y"], "foo";
my $z = bless ["z"], "foo";
my $w = bless ["w"], "foo";
# how perl parses it:
my $p2 = $x | $y; # …Run Code Online (Sandbox Code Playgroud) 我试图找到toStrict类型的函数Data.Text.Lazy.Text -> Data.Text.Text,但我不知道a)它被称为什么,以及b)究竟什么是Lazy模块名称.
搜索Hayoo Text -> Text会带来很多结果.有没有办法搜索签名*Lazy*Text -> Text?
搜索Data.Text.Lazy.Text -> Text不会产生任何结果.
我应该如何(lazy) Text -> (strict) Text使用hayoo,hoogle或......来寻找类型的功能?
假设我有一个简单的数据类型,如:
data Cell = Open | Blocked
Run Code Online (Sandbox Code Playgroud)
我想用一个UArray Int Cell.是否有捷径可寻?我可以以某种方式重用该定义UArray Int Bool吗?
在OS XI上有一个简单的html页面,我用file:///...url 打开它.此页面包含尝试加载http://...资源的javascript .
这可以使用Safari,但在Firefox或Chrome下无效.我从这些浏览器获得的错误消息是:
跨源请求已阻止:同源策略禁止在http:// whatever/etc中读取远程资源.(原因:缺少CORS标题'Access-Control-Allow-Origin').
是否可以让页面在Firefox和Chrome下运行?
我想知道如何在列表中添加'partitionCount'方法,例如:(未经过测试,无耻地基于List.scala):
我是否必须创建自己的子类和隐式类型转换器?
(我最初的尝试有很多问题,所以这里有一个基于@Easy的答案):
class MyRichList[A](targetList: List[A]) {
def partitionCount(p: A => Boolean): (Int, Int) = {
var btrue = 0
var bfalse = 0
var these = targetList
while (!these.isEmpty) {
if (p(these.head)) { btrue += 1 } else { bfalse += 1 }
these = these.tail
}
(btrue, bfalse)
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个更适合Seq [...]的通用版本:
implicit def seqToRichSeq[T](s: Seq[T]) = new MyRichSeq(s)
class MyRichList[A](targetList: List[A]) {
def partitionCount(p: A => Boolean): (Int, Int) = {
var btrue = 0
var bfalse …Run Code Online (Sandbox Code Playgroud) 这是一种解决欧拉问题43的方法(如果没有给出正确答案,请告诉我).是否有monad或其他合成糖可以帮助跟踪notElem条件?
toNum xs = foldl (\s d -> s*10+d) 0 xs
numTest xs m = (toNum xs) `mod` m == 0
pandigitals = [ [d0,d1,d2,d3,d4,d5,d6,d7,d8,d9] |
d7 <- [0..9],
d8 <- [0..9], d8 `notElem` [d7],
d9 <- [0..9], d9 `notElem` [d8,d7],
numTest [d7,d8,d9] 17,
d5 <- [0,5], d5 `notElem` [d9,d8,d7],
d3 <- [0,2,4,6,8], d3 `notElem` [d5,d9,d8,d7],
d6 <- [0..9], d6 `notElem` [d3,d5,d9,d8,d7],
numTest [d6,d7,d8] 13,
numTest [d5,d6,d7] 11,
d4 <- [0..9], d4 `notElem` [d6,d3,d5,d9,d8,d7],
numTest [d4,d5,d6] 7,
d2 …Run Code Online (Sandbox Code Playgroud)