据我所知,GHC(Glorious Glasgow Haskell编译器)将Haskell编译为"Core",然后将Core编译为机器代码.将Haskell程序作为GHC Core分发是否完全可行,就像它是"字节码"一样?这样的发行会有什么好处吗?为什么或者为什么不?
Haskell代码中经常出现以下模式.是否有更短的方式来写它?
if pred x
then Just x
else Nothing
Run Code Online (Sandbox Code Playgroud) 定义像这样的运算符非常容易
(@) :: [x -> y] -> [x] -> [y]
Run Code Online (Sandbox Code Playgroud)
它获取函数列表和输入列表,并返回输出列表.有两种明显的方法可以实现这一点:
要么定义也同样微不足道.关于它的好处是你现在可以做类似的事情
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) 我仍然是一名哈斯克尔初学者.我可以在哈斯克尔做双重地图吗?
例如,如果我有一个[[Char]]并且我想将每个Char中的每个转换[Char]为小写,那么有一种简单的方法可以做到这一点,而不是像:
exampleF [] = []
exampleF (x:xs) = (map toLower x) : exampleF xs
Run Code Online (Sandbox Code Playgroud) 我在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
在Haskell中写这个Scala矩阵乘法的冗长讨论后,我想知道......类型安全矩阵乘法会是什么样的?所以这是你的挑战:要么链接到Haskell实现,要么自己实现,如下:
data Matrix ... = ...
matrixMult :: Matrix ... -> Matrix ... -> Matrix ...
matrixMult ... = ...
Run Code Online (Sandbox Code Playgroud)
当matrixMult产生一个错误类型在编译的时候,如果你试图乘两个matricies不兼容的尺寸.布朗尼指出,如果你链接到讨论这个精确主题的论文或书籍,和/或讨论自己这个功能是多么有用/无用.
这些属性不被视为标准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问题.
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) 我想创建这个函数,它从集合中选择一个随机元素:
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)
但是使用 …
管道是一个非常优雅,非常简单的迭代版本.您可以使用基元await和非常容易地编写管道代码yield.Paolo Capriotti扩展了带有防护管道的管道概念,该管道使用稍微复杂的tryAwait基元,一旦输入流量耗尽,管道就可以执行一些定型.
受保护管道实施方案,重新定义await来讲tryAwait:
await = tryAwait >>= maybe discard return
Run Code Online (Sandbox Code Playgroud)
我的问题是:如果我编写针对更简单的Pipes实现的代码(使用await和yield),使用相同的代码,如果我切换到受保护的管道实现,它的行为是否相同?换句话说,在行为方面,保护管道代码可以简单地视为管道代码的超集吗?
haskell ×9
memoization ×2
performance ×2
bytecode ×1
combinators ×1
css ×1
function ×1
ghc ×1
if-statement ×1
iterate ×1
list ×1
mapping ×1
matrix ×1
maybe ×1
random ×1
set ×1
standards ×1