我有一个表示某个状态的值元组,并希望通过加法(shift)来翻译它.我的值是(Int,[Int],Int)的更长版本,我想要一些概念上(但不是字面意思)的东西:
shift n = ??? (+n) (id, map, id) -- simple(?)
Run Code Online (Sandbox Code Playgroud)
这相当于:
shift n (a, b, c) = (a+n, map (+n) b, c+n)
Run Code Online (Sandbox Code Playgroud)
我很高兴能够使用这个明确的函数用法,但是想知道它有一个更惯用的无点版本使用Applicative或Arrows或......,或者如果它们最终会混淆一些东西.我认为无点版本更清楚地显示了操作的基本结构.
为什么这种类型的单一用法编译,但将其放入列表失败?
ft1 :: (Foldable t, Num a) => t a -> a
ft1 = (F.foldl (+) 0)
fTest :: [(Foldable t, Num a) => t a -> a ]
fTest = [ F.foldl (+) 0 ]
Run Code Online (Sandbox Code Playgroud)
后者给出错误:
folding.hs:80:10:
Illegal polymorphic or qualified type:
(Foldable t, Num a) => t a -> a
Perhaps you intended to use ImpredicativeTypes
In the type signature for `fTest':
fTest :: [(Foldable t, Num a) => t a -> a]
Run Code Online (Sandbox Code Playgroud)
Simliarly,尝试命名它失败(不同):
type Ftst t a …Run Code Online (Sandbox Code Playgroud) 一些基本问题,用于将SML代码转换为Haskell.
1)我习惯于在SML代码中使用本地嵌入式表达式,例如测试表达式,打印等,它们在加载(评估)代码时对本地测试和输出起作用.在Haskell中,似乎获得结果(评估)的唯一方法是在模块中添加代码,然后转到另一个模块中的main并添加一些东西来调用和打印结果.
这是正确的吗?在GHCi中,我可以输入表达式并查看结果,但这可以自动化吗?每次测试评估都要进入顶级主要部分对我来说似乎不方便 - 也许只需要改变我的懒惰范式.
2)在SML中,我可以对返回的结果进行模式匹配和统一,例如
Run Code Online (Sandbox Code Playgroud)val myTag(x) = somefunct(a,b,c);
并在匹配后获得x的值.
我可以轻松地在Haskell中做类似的事情,而无需编写单独的提取函数吗?
3)如何使用元组参数进行构造函数,即未经证实.
在SML中:
数据类型Thing = Int*Int的信息;
但是在哈斯克尔,我试过了;
数据Thing = Info(Int Int)
哪个失败了.("Int应用于类型中的太多参数:一些Int Int")curried版本工作正常,
数据Thing = Info Int Int
但我想要没有咖喱.
谢谢.
我想做一个类似于模式匹配的函数来获取前两个元素,然后数组的其余部分返回值.
例如,假设perms(x)返回值列表,我想这样做:
seq=perms(x)
a = seq[0]
b = seq[1]
rest = seq[2:]
Run Code Online (Sandbox Code Playgroud)
我当然可以缩短到:
[a,b] = seq[0:2]
rest = seq[2:]
Run Code Online (Sandbox Code Playgroud)
我可以使用一些符号来做到这一点吗?
[a,b,more] = perms(x)
Run Code Online (Sandbox Code Playgroud)
或概念上:
[a,b,more..] = perms(x)
Run Code Online (Sandbox Code Playgroud)
PROLOG和函数式语言确实列出了这样的分解!
我不明白为什么需要基本案例:
-- perms :: Ord a => [a] -> [[a]]
perms [] = [[]]
perms xs = [ (x:ps) | x <- xs, ps <- perms (xs \\ [x])]
Run Code Online (Sandbox Code Playgroud)
在我看来它应该是自动从列表理解,但后来我注意到:
[ x:y | x<-[], y<-[] ]
Run Code Online (Sandbox Code Playgroud)
评估为[],而不是[[]],这似乎令人惊讶.
即便如此,我也很惊讶,如果没有基本情况它运行,但总是给[],这违反了类型签名.有没有一种简单的方法来跟踪列表理解的执行?它似乎是Debug.Trace.trace的原子.
http://www.haskell.org/haskellwiki/Memoization
显示这个:
Map () b := b
Map (Either a a') b := (Map a b, Map a' b)
Map (a,a') b := Map a (Map a' b)
Run Code Online (Sandbox Code Playgroud)
毫无疑问,这很简单,但我不认识语法,谷歌和我都不知道":="运算符是做什么的.:-)看起来像一个重载的构造函数定义,也许对于Assoc类?
一本旧的(Davies)Haskell书在PreludeArray模块中显示了这一点,但我不再发现它了.
有没有简单的方法来跟踪Haskell中List-comprehension的评估?它们非常紧凑,但也可能使它们难以调试.
我试图在Windows上安装反应式香蕉包,但收效甚微.它似乎知道包,但安装失败.任何提示?
>cabal install Reactive
Resolving dependencies...
...
cabal: Error: some packages failed to install:
category-extras-0.53.5 failed during the building phase. The exception was:
ExitFailure 1
reactive-0.11.5 depends on category-extras-0.53.5 which failed to install.
>cabal install category-extras
Resolving dependencies...
Configuring category-extras-0.53.5...
...
cabal: Error: some packages failed to install:
category-extras-0.53.5 failed during the building phase. The exception was:
ExitFailure 1
>cabal install reactive-banana-wx
Resolving dependencies...
Downloading monads-tf-0.1.0.0...
Warning: monads-tf.cabal: A package using 'cabal-version: >=1.2.3' must use
section syntax. See the Cabal …Run Code Online (Sandbox Code Playgroud) 我想翻转列表构造函数用法,以获得类型:
[a] -> a -> [a]
Run Code Online (Sandbox Code Playgroud)
(用于折叠),所以尝试:
(flip :)
Run Code Online (Sandbox Code Playgroud)
但它给出了类型:
Prelude> :t (flip :)
(flip :) :: [(a -> b -> c) -> b -> a -> c] -> [(a -> b -> c) -> b -> a -> c]
Run Code Online (Sandbox Code Playgroud)
这让我感到惊讶,但似乎这被解析为(:)的左侧部分,而不是翻转的部分应用.使用flip作为中缀重写它似乎克服了这一点,
Prelude> :t ((:) `flip`)
((:) `flip`) :: [a] -> a -> [a]
Run Code Online (Sandbox Code Playgroud)
但是我找不到定义这种行为的规则,我认为函数应用程序是最高优先级,并且被评估为left-> right,所以我希望这两种形式是等价的.
我有一个简短的 perl (cgi) 程序,可以解析并显示一些天气数据。
我从带有嵌套值的 XML 源获取数据,每个值都有唯一的标签。
现在我得到了一些包含多个条目的数据,由一个唯一的“类型”字段区分,然后每个条目都有一个(不同的)值。
以前的数据:
<weather ver="2.0">
<head>
<locale>en_US</locale>
</head>
<loc id="52557">
</loc>
<cc>
<tmp>16</tmp>
<flik>16</flik>
<t>Mostly Cloudy</t>
<bar>
<r>1022.35</r>
<d>steady</d>
</bar>
<wind>
<s>14</s>
<gust>N/A</gust>
<d>120</d>
<t>ESE</t>
</wind>
<hmid>77</hmid>
</cc>
</weather>
Run Code Online (Sandbox Code Playgroud)
所以我可以这样访问:(相关片段..)
use XML::XPath;
use XML::XPath::Parser;
sub getData($) {
my $url = http://wxdata.weather.com/wxdata/weather/local/52557?cc=*&unit=$unit;
return get($url);
# returned values are XML::XPath::Nodeset (not numbers, or strings!!)
my $xml = getData($zip);
$xp = XML::XPath->new($xml);
sub getVal($) { ## ("tag")
my $tag = shift;
return $xp->findvalue($tag)->value();
sub postData($) {
my …Run Code Online (Sandbox Code Playgroud) 看看一些monad 示例,在Learn You a HaskellWriter中的一个示例中,我没有看到最后一行表达式中的乘法运算符的使用被重载以与函数生成的对象一起使用:*WriterlogNumber
import Control.Monad.Writer
logNumber :: Int -> Writer [String] Int
logNumber x = Writer (x, ["Got number: " ++ show x])
multWithLog :: Writer [String] Int
multWithLog = do
a <- logNumber 3
b <- logNumber 5
return (a*b)
Run Code Online (Sandbox Code Playgroud) 我复制了(http://www.haskell.org/haskellwiki/Euler_problems/11_to_20#Problem_11)上给出的Euler.11解决方案,但它失败并出现索引错误:" (Array.!):undefined array element ".当然首先我想要一个更好的错误消息(!),甚至可能给出失败的索引,但是我没有尝试调试它.
数据输入正确,打印数据显示正确的边界和数据.
所以我在结果表达式和理解体中添加了一些跟踪消息.我从最终表达式中获得了大量的跟踪结果,但是没有来自主体计算的结果.为什么?
prods :: Array (Int, Int) Int -> [Int]
-- trace ("xs: " ++ show xs) (product xs)
prods a = [trace ("xs: " ++ show xs) (product xs) | i <- range $ bounds a,
s <- senses,
let trace1 = check "i: " i,
let is = take 4 $ iterate s i,
let trace2 = check "is: " is,
all (inArray a) is,
let xs = map (a!) is] …Run Code Online (Sandbox Code Playgroud)