这是一个.cabal文件: Name: myprogram Version: 0.1 — blah blah blah Cabal-version: >=1.9.2 Executable myprogram HS-source-dirs: src Main-is: Main.hs Build-depends: attoparsec == 0.10.*, base == 4.3.*, — long long list of packages Test-Suite test HS-source-dirs: test, src Type: exitcode-stdio-1.0 Main-is: Main.hs Build-depends: attoparsec == 0.10.*, base == 4.3.*, — long long list of packages QuickCheck == 2.4.* […]
我刚刚开始熟悉种类的概念,所以如果我不能很好地解决我的问题,请耐心等待… 值有types: 3 :: Int [1,2,3] :: [Int] ('c',True) :: (Char,Bool) types有种类: the type 'Int' has kind * the type '[Int]' also has kind * but the type constructor [] has kind * -> * similarly, the type (Char,Bool) has kind * but the type constructor (,) has kind * -> * -> * 种类有什么? […]
尽pipeHaskell社区的一般观点似乎是,最好是使用Text而不是String ,事实上,大多数维护库的API仍然是以String导向的,这使得我迷惑不解。 另一方面,还有一些值得注意的项目 ,它们将String视为一个错误,并提供了一个Prelude其中包含所有以String oriented为目的函数的实例,并将其replace为Text -counterparts。 那么除了向后和标准的Prelude-兼容性和“转换惯性”之外,还有什么原因让人们继续编写面向String的API? 与String相比, Text可能还有其他什么缺点? 特别是,我对此感兴趣,因为我正在devise一个库,并试图决定使用哪种types来表示错误消息。
我知道newtype与Haskell中的data相比经常被比较,但是我从更多的deviseangular度来比较这个比较,而不是技术问题。 在不确定/ OO语言中,存在反模式的“ 原始痴迷 ”,其中原始types的大量使用降低了程序的types安全性并且引入了相同types值的意外互换性,否则旨在用于不同目的。 例如,很多东西可以是一个string,但是如果一个编译器能够静态地知道我们的意思是一个名字,我们的意思是在一个地址中的城市,这将是很好的。 那么,Haskell程序员多newtype使用newtype来区别原始值呢? type的使用引入了一个别名,并赋予程序的可读性更清晰的语义,但并不防止意外地交换值。 当我学习haskell时,我注意到types系统和我所遇到的一样强大。 因此,我认为这是一个自然而常见的做法,但从这个angular度来看,我还没有看到太多或者有什么新用法的讨论。 当然,很多程序员都是以不同的方式做事,但这在haskell中是如此普遍吗?
我已经读过,Scala的types系统被Java的互操作性所削弱,因此不能像Haskell的types系统那样执行一些相同的function。 这是真的? 是因为types擦除的弱点,还是我在各方面都是错的? 这是不同的原因斯卡拉没有typeclasses?
数据结构上有大量文本,数据结构代码库也有。 我明白,纯粹的function数据结构更容易推理。 然而,我很难理解在实际代码中使用纯函数式数据结构(使用函数式编程语言还是不使用函数式编程语言)在命令式对象上的真实世界优势。 有人可以提供一些真正的世界情况下,纯function数据结构有优势,为什么? 像我在编程语言中使用data_structure_name来做应用程序,因为它可以做某些事情 。 谢谢。 PS:我的意思是纯数据结构和持久数据结构不一样。 持久的数据结构是一个不会改变的数据结构? 另一方面,纯function数据结构是纯粹操作的数据结构。
我已经用yarr 方法模拟了太阳系的外层行星,并且实现了a)使用了yarr和b)使用yarr 。 yarr似乎执行比x30更快 。 鉴于此,我甚至没有尝试使用并行性。 我的代码中有没有明显的性能问题? 存储库在github上 。 如果这有帮助,我可以制作一个简化的重新版本的版本,但是你不会得到与yarr的性能比较。 或者,我如何debuggingrepa性能问题?
最近有一个关于Sets的讨论,Scala支持zip方法,以及如何导致bug,例如 scala> val words = Set("one", "two", "three") scala> words zip (words map (_.length)) res1: Set[(java.lang.String, Int)] = Set((one,3), (two,5)) 我想这很清楚Set s不应该支持zip操作,因为这些元素没有sorting。 然而,有人提出问题是Set不是一个真正的函子,也不应该有一个map方法。 当然,你可以通过映射到一个集合,让自己陷入麻烦。 现在切换到Haskell, data AlwaysEqual a = Wrap { unWrap :: a } instance Eq (AlwaysEqual a) where _ == _ = True instance Ord (AlwaysEqual a) where compare _ _ = EQ […]
所以我理解types的基本代数解释: Either ab ~ a + b (a, b) ~ a * b a -> b ~ b^a () ~ 1 Void ~ 0 — from Data.Void …这些关系对于具体types是正确的,比如Bool ,而不是像a这样a多态types。 我也知道如何将多态types的types签名转换成具体的types表示,只需要按照下面的同构翻译教会编码: (forall r . (a -> r) -> r) ~ a 所以如果我有: id :: forall a . a -> a 我知道这并不意味着id ~ a^a ,但它实际上意味着: id :: […]
我一直很想知道是否有可能将Haskell的强大function应用于embedded式实时世界,并且在Google上search到了Atom包。 我假设,在复杂的情况下,代码可能会有所有经典的C错误 – 崩溃,内存损坏等,然后需要追溯到原来的Haskell代码,造成他们。 所以,这是问题的第一部分:“如果您有Atom的经验,那么您是如何处理debugging编译的C代码中的低级错误并将其修复到Haskell原始代码中的呢? 我search了更多Atom的例子, 这个博客文章提到了C代码22KLOC(显然没有代码:), 包含的例子是一个玩具。 这个和这个引用有一些更实际的代码,但是这是结束的地方。 我在这个主题中提出“相当大”的原因是,我最感兴趣的是如果你能分享你在300KLOC +范围内生成C代码的经验。 由于我是一名Haskell新手,显然还有其他的方式,由于我未知的未知,所以没有find其他的方法,所以在这方面的任何其他自我教育的指针将不胜感激 – 这是问题的第二部分 – “Haskell做实时开发的其他一些实用方法是什么?”。 如果多核也在图片中,那是多余的:-) (关于Haskell本身用于这个目的的使用:从我在这篇博文中读到的内容来看,Haskell中的垃圾收集和懒惰使得它在调度方面非常不确定,但也许在两年之后有所改变。是我能find这个话题最接近的) 注意:上面的“实时”会更接近“硬实时” – 我很好奇,如果可以确保主任务不执行时的暂停时间在0.5ms以下。