小编Dan*_*ton的帖子

GHC Core为"字节码"?

据我所知,GHC(Glorious Glasgow Haskell编译器)将Haskell编译为"Core",然后将Core编译为机器代码.将Haskell程序作为GHC Core分发是否完全可行,就像它是"字节码"一样?这样的发行会有什么好处吗?为什么或者为什么不?

haskell bytecode ghc

17
推荐指数
1
解决办法
1088
查看次数

编写此代码的方法较短

Haskell代码中经常出现以下模式.是否有更短的方式来写它?

if pred x
then Just x
else Nothing
Run Code Online (Sandbox Code Playgroud)

haskell if-statement combinators maybe

16
推荐指数
4
解决办法
922
查看次数

嵌套函数应用程序

定义像这样的运算符非常容易

(@) :: [x -> y] -> [x] -> [y]
Run Code Online (Sandbox Code Playgroud)

它获取函数列表和输入列表,并返回输出列表.有两种明显的方法可以实现这一点:

  1. 将第一个函数应用于第一个输入,将第二个函数应用于第二个输入,等等.
  2. 将每个功能应用于每个输入.

要么定义也同样微不足道.关于它的好处是你现在可以做类似的事情

foo :: X -> Y -> Z -> R

bar :: [X] -> [Y] -> [Z] -> [R]
bar xs ys zs = [foo] @@ xs @@ ys @@ zs
Run Code Online (Sandbox Code Playgroud)

这概括为任意数量的函数参数.


到现在为止还挺好.现在针对问题:如何更改类型签名以@@使类型签名bar变为

bar :: [X] -> [Y] -> [Z] -> [[[R]]]
Run Code Online (Sandbox Code Playgroud)

实现这种类型的函数并不难; 其中任何一个都会这样做:

bar xs ys zs = map (\ x -> map (\ y -> map (\ z -> foo x …
Run Code Online (Sandbox Code Playgroud)

haskell function list

16
推荐指数
2
解决办法
299
查看次数

在haskell的双重地图?

我仍然是一名哈斯克尔初学者.我可以在哈斯克尔做双重地图吗?

例如,如果我有一个[[Char]]并且我想将每个Char中的每个转换[Char]为小写,那么有一种简单的方法可以做到这一点,而不是像:

exampleF [] = []
exampleF (x:xs) = (map toLower x) : exampleF xs
Run Code Online (Sandbox Code Playgroud)

mapping haskell

16
推荐指数
2
解决办法
5993
查看次数

Haskell中动态编程的高效表

我在Haskell中编写了0-1背包问题.到目前为止,我对于懒惰和普遍性水平感到自豪.

我首先提供了创建和处理惰性2d矩阵的函数.

mkList f = map f [0..]
mkTable f = mkList (\i -> mkList (\j -> f i j))

tableIndex table i j = table !! i !! j
Run Code Online (Sandbox Code Playgroud)

然后我为一个给定的背包问题制作一个特定的表格

knapsackTable = mkTable f
    where f 0 _ = 0
          f _ 0 = 0
          f i j | ws!!i > j = leaveI
                | otherwise = max takeI leaveI
              where takeI  = tableIndex knapsackTable (i-1) (j-(ws!!i)) + vs!!i
                    leaveI = tableIndex knapsackTable (i-1) j

-- weight …
Run Code Online (Sandbox Code Playgroud)

haskell knapsack-problem memoization dynamic-programming lazy-evaluation

15
推荐指数
2
解决办法
3522
查看次数

类型安全矩阵乘法

在Haskell写这个Scala矩阵乘法的冗长讨论后,我想知道......类型安全矩阵乘法会是什么样的?所以这是你的挑战:要么链接到Haskell实现,要么自己实现,如下:

data Matrix ... = ...

matrixMult :: Matrix ... -> Matrix ... -> Matrix ...
matrixMult ... = ...
Run Code Online (Sandbox Code Playgroud)

matrixMult产生一个错误类型编译的时候,如果你试图乘两个matricies不兼容的尺寸.布朗尼指出,如果你链接到讨论这个精确主题的论文或书籍,和/或讨论自己这个功能是多么有用/无用.

haskell matrix matrix-multiplication

15
推荐指数
3
解决办法
2389
查看次数

如何使IE支持min-width/max-width CSS属性?

这些属性不被视为标准CSS吗?

我正在使用这样的东西,它可以在Chrome 12,FF4,Opera 11和Safari 5上正常工作,但在IE9上,如果使用的话,最小宽度不受尊重width < min-width.

<span style="float:left; width:11%; min-width:150px;">
    ...
</span>
Run Code Online (Sandbox Code Playgroud)

编辑:对自由编辑和迁移我的问题有点恼火,但没有.这是一个更全面的例子,显示了IE9与其他浏览器的明显区别.

<html><body>
<p style="width: 600px">
<span style="float: left; width: 11%; min-width: 150px">Hello.</span>
<span style="float: left; width: 11%">World.</span>
</p>
</body></html>
Run Code Online (Sandbox Code Playgroud)

编辑2:如下面Kevin的评论中所述,添加<!DOCTYPE html>到开头解决了IE问题.

css standards internet-explorer

14
推荐指数
1
解决办法
4万
查看次数

对于SPOJ,这个memoized DP表的速度有多慢?

SPOILERS:我正在http://www.spoj.pl/problems/KNAPSACK/上工作,所以如果你不想为你破坏可能的解决方案,请不要偷看.

样板:

import Data.Sequence (index, fromList)
import Data.MemoCombinators (memo2, integral)

main = interact knapsackStr

knapsackStr :: String -> String
knapsackStr str = show $ knapsack items capacity numItems
  where [capacity, numItems] = map read . words $ head ls
        ls = lines str
        items = map (makeItem . words) $ take numItems $ tail ls
Run Code Online (Sandbox Code Playgroud)

设置舞台的一些类型和帮助:

type Item = (Weight, Value)
type Weight = Int
type Value = Int

weight :: Item -> Weight
weight = fst

value …
Run Code Online (Sandbox Code Playgroud)

performance haskell knapsack-problem memoization

14
推荐指数
1
解决办法
773
查看次数

从集合中选择随机元素,比线性时间快(Haskell)

我想创建这个函数,它从集合中选择一个随机元素:

randElem :: (RandomGen g) => Set a -> g -> (a, g)
Run Code Online (Sandbox Code Playgroud)

可以编写简单的列表实现.例如(代码更新,验证工作):

import Data.Set as Set
import System.Random (getStdGen, randomR, RandomGen)

randElem :: (RandomGen g) => Set a -> g -> (a, g)
randElem s g = (Set.toList s !! n, g')
    where (n, g') = randomR (0, Set.size s - 1) g

-- simple test drive
main = do g <- getStdGen
          print . fst $ randElem s g
    where s = Set.fromList [1,3,5,7,9]
Run Code Online (Sandbox Code Playgroud)

但是使用 …

random performance haskell set

13
推荐指数
3
解决办法
2311
查看次数

保护管道的行为与使用等待的管道相同吗?

管道是一个非常优雅,非常简单的迭代版本.您可以使用基元await和非常容易地编写管道代码yield.Paolo Capriotti扩展了带有防护管道的管道概念,该管道使用稍微复杂的tryAwait基元,一旦输入流量耗尽,管道就可以执行一些定型.

受保护管道实施方案,重新定义await来讲tryAwait:

await = tryAwait >>= maybe discard return
Run Code Online (Sandbox Code Playgroud)

我的问题是:如果我编写针对更简单的Pipes实现的代码(使用awaityield),使用相同的代码,如果我切换到受保护的管道实现,它的行为是否相同?换句话说,在行为方面,保护管道代码可以简单地视为管道代码的超集吗?

haskell iterate

13
推荐指数
2
解决办法
850
查看次数