核心是GHC的中间语言.阅读核心可以帮助您更好地了解您的计划的性能.有人问我关于阅读Core的文档或教程,但我找不到多少.
有哪些文档可供阅读GHC Core?
这是我到目前为止所发现的:
Haskell中多核编程的现状如何?现在有哪些项目,工具和库?有什么经验报告?
parallel-processing concurrency haskell functional-programming multicore
我遇到了一段看起来像这样的Haskell代码:
ps@(p:pt)
Run Code Online (Sandbox Code Playgroud)
@在这种情况下,符号意味着什么?我似乎无法在Google上找到任何信息(遗憾的是很难在Google上搜索符号),而且我在Prelude文档中找不到该功能,所以我想它必须是某种语法糖.
对于那些在Haskell和一些Lisp中都有经验的人,我很好奇是如何"愉快"(使用一个可怕的术语)是在Haskell和Lisp中编写代码.
一些背景:我学习Haskell现在,稍早有计划和CL(和一点点进军Clojure的)工作.传统上,你可以认为我是动态语言的粉丝,因为它们提供了简洁和快速.我很快就爱上了Lisp宏,因为它给了我另一种避免冗长和样板的方法.
我发现哈斯克尔难以置信的有趣,因为它把我介绍给编码我不知道的方式.它肯定有一些方面似乎有助于实现敏捷性,比如易于编写部分功能.不过,我有点担心失去Lisp的宏(我假设我失去他们,说实话我可能只是没有了解他们吗?)和静态类型系统.
会有人谁做了两个世界编码,像样的数目介意评论经验如何不同,您喜欢哪一种,如果说偏好的态势?
我想在Haskell中做一些看起来像这样的事情:
main1 = do s <- getLine
if s == "foo" then putStr "You entered foo"
Run Code Online (Sandbox Code Playgroud)
显然这是不合法的,因为没有else.我想到的另一种选择:
nop :: IO ()
nop = sequence_ []
main2 = do s <- getLine
if s == "foo" then putStr "You entered foo" else nop
Run Code Online (Sandbox Code Playgroud)
这有点冗长,但如果有必要,我会满足.如果没有内置版本,我会感到惊讶nop.
或者:
doIf :: Bool -> IO () -> IO ()
doIf b m = if b then m else nop
main3 = do s <- getLine
doIf (s == "foo") (putStr "You entered …Run Code Online (Sandbox Code Playgroud) 我正在和初学者Haskell一起玩,我想写一个普通的函数.这似乎是世界上最简单的事情,对吧?
错误.
似乎Haskell的类型系统禁止平均处理泛型数字类型 - 我可以使它在Integrals列表或Fractionals列表上工作,但不能同时工作.
我想要:
average :: (Num a, Fractional b) => [a] -> b
average xs = ...
Run Code Online (Sandbox Code Playgroud)
但我只能得到:
averageInt :: (Integral a, Fractional b) => [a] -> b
averageInt xs = fromIntegral (sum xs) / fromIntegral (length xs)
Run Code Online (Sandbox Code Playgroud)
要么
averageFrac :: (Fractional a) => [a] -> a
averageFrac xs = sum xs / fromIntegral (length xs)
Run Code Online (Sandbox Code Playgroud)
而第二个似乎工作.直到我尝试传递变量.
*Main> averageFrac [1,2,3]
2.0
*Main> let x = [1,2,3]
*Main> :t x
x :: [Integer]
*Main> averageFrac x
<interactive>:1:0:
No …Run Code Online (Sandbox Code Playgroud) 该哈斯克尔维基做了解释如何使用存在类型的一个很好的工作,但我不太神交背后的理论.
考虑这个存在类型的例子:
data S = forall a. Show a => S a -- (1)
Run Code Online (Sandbox Code Playgroud)
为我们可以转换为的东西定义一个类型包装器String.维基提到我们真正想要定义的是类似的类型
data S = S (exists a. Show a => a) -- (2)
Run Code Online (Sandbox Code Playgroud)
即一个真正的"存在主义"类型 - 松散地我认为这是"数据构造函数S采用Show实例存在并包装它的任何类型".事实上,你可能会写一个GADT如下:
data S where -- (3)
S :: Show a => a -> S
Run Code Online (Sandbox Code Playgroud)
我没有尝试过编译,但似乎它应该可行.对我来说,GADT显然等同于我们想写的代码(2).
然而,对我来说,完全不明白为什么(1)等同于(2).为什么将数据构造函数移到外面forall变成了exists?
我能想到的最接近的是De Morgan的逻辑定律,其中交换否定的顺序和量词将存在量词转换为通用量词,反之亦然:
¬(?x. px) ? ?x. ¬(px)
Run Code Online (Sandbox Code Playgroud)
但是数据构造函数似乎与否定运算符完全不同.
使用forall而不是不存在来定义存在类型的能力背后的理论是什么exists?
什么是Haskell的Stream Fusion以及如何使用它?
我知道在Haskell中newtype经常被比较data,但我从更多的设计观点而不是技术问题中提出这种比较.
在不完全/ OO语言中,存在反模式" 原始的痴迷 ",其中原始类型的大量使用降低了程序的类型安全性并且引入了相同类型值的意外互换性,否则用于不同目的.例如,很多东西都可以是String,但如果编译器可以静态地知道我们的名字是什么以及我们想要成为地址中的城市,那将会很好.
那么,Haskell程序员用多长时间newtype来对其他原始值进行类型区分呢?使用type引入别名并为程序的可读性提供更清晰的语义,但不会阻止意外地交换值.当我学习haskell时,我注意到类型系统和我遇到的任何类型系统一样强大.因此,我认为这是一种自然而普遍的做法,但我没有看到太多或任何有关使用的讨论newtype.
当然,很多程序员都会以不同的方式做事,但这在haskell中是否常见?
Hoogle允许您通过函数名称或近似类型签名搜索许多标准Haskell库.我发现它非常有用.对于Scala有什么类似Hoogle的吗?在ScalaDoc 2中搜索仅按名称查找类型和包.
haskell ×10
type-systems ×3
types ×3
syntax ×2
comparison ×1
concurrency ×1
ghc ×1
io ×1
lisp ×1
list ×1
multicore ×1
optimization ×1
performance ×1
quantifiers ×1
scala ×1
typeclass ×1