Tag: haskell

如何在使用GHCi时为函数提供显式types声明?

如何在GHCi中定义这个函数的等价物(取自learnyouahaskell )? import Data.List numUniques :: (Eq a) => [a] -> Int numUniques = length . nub 如果没有types声明,GHCi接受函数定义,但是最后是一个无用的types: Prelude Data.List> import Data.List Prelude Data.List> let numUniques' = length . nub Prelude Data.List> :t numUniques' numUniques' :: [()] -> Int 结果函数只接受一个单位列表作为参数。 GHCi中有没有提供types声明的方法? 还是有另一种方法来定义这些不需要types声明的函数? 我没有看到GHCi指南中的明显线索,并尝试使用下列expression式(无效): > let numUniques' = ((length . nub) :: (Eq a) => [a] […]

DatatypeContexts在最新的GHC中弃用:为什么?

我刚刚做了一些Haskell开发,我重新编译了GHC新版本中的一些旧代码: The Glorious Glasgow Haskell Compilation System, version 7.2.1 当我做了我收到以下错误: 警告:-XDatatypeContexts已被弃用:它被广泛认为是错误的,并且已经从Haskell语言中删除。 当您使用以下格式的代码时会出现: data Ord a => MyType a = ConstructorOne a = ConstructorTwo aa 我的问题是:为什么这个function首先被弃用,我应该做什么,而不是实现相同或相似的function?

Haskell轻量级线程开销并用于多核

我一直在阅读“真实世界Haskell”一书,关于并发性和并行性的一章。 我的问题如下: 由于Haskell线程真的只是一个“真正的”OS线程中的多个“虚拟”线程,这是否意味着创build很多(如1000)不会对性能产生严重影响? 也就是说,我们可以说用forkIO创build一个Haskell线程的开销(几乎)可以忽略不计? 如果可能,请带上切实的例子。 轻量级线程的概念不妨碍我们使用多核架构的好处吗? 据我所知,两个Haskell线程不可能同时在两个独立的内核上执行,因为从操作系统的angular度来看,它们确实是一个单一的线程。 还是Haskell运行时做了一些巧妙的技巧,以确保可以使用多个CPU?

任何真实的使用软件事务内存的经验?

STM(软件事务内存)框架和语言扩展最近似乎越来越受到关注。 特别是Clojure有一个很好的实现,它使用MVCC(多版本并发控制)而不是滚动提交日志。 GHC Haskell也有一个非常优雅的STM monad ,它也允许交易组成。 最后,为了使我自己的号angular变得有些小,我最近实现了一个Scala的STM框架,它静态地强制引用限制。 所有这些都是有趣的实验,但它们似乎仅限于这个领域(实验)。 所以我的问题是:有没有人在现实世界中看过或使用过STM? 如果是这样,为什么? 它带来了什么样的好处? 性能呢? (关于这一点,似乎有很多矛盾的信息)你会再次使用STM还是更喜欢使用一些像演员一样的其他并发抽象?

逻辑编程和function编程的区别

我一直在阅读许多文章,试图理解function和逻辑编程之间的区别,但迄今为止唯一能够做出的演绎是逻辑编程通过mathexpression式来定义程序。 但是这样的事情与逻辑编程没有关系。 我真的很感激function和逻辑编程之间的区别。

什么构成了除列表之外的types的折叠?

考虑一个单链表。 它看起来像 data List x = Node x (List x) | End 定义折叠函数是很自然的 reduce :: (x -> y -> y) -> y -> List x -> y 从某种意义上说, reduce f x0用reduce f x0代替每个Node用reduce f x0代替每个Node 。 这是前奏曲所指的折叠 。 现在考虑一个简单的二叉树: data Tree x = Leaf x | Branch (Tree x) (Tree x) 定义一个函数,如 reduce :: (y […]

意想不到的types与简单的老分类

上个星期我的一个朋友提出了一个看似无害的Scala语言问题,我没有很好的答案:是否有一种简单的方法来声明属于某种常见types类的东西的集合。 当然在Scala中没有“types类”的一stream概念,所以我们必须从特征和上下文边界(即含义)的angular度来思考这个概念。 具体来说,给定表示typestypes的一些特征T[_]以及范围为T[A] , T[B]和T[C]相应含义的typesA , B和C ,我们想要声明类似List[T[a] forAll { type a }] ,我们可以将A , B和C实例逍遥法外。 这在斯卡拉当然不存在; 去年的一个问题更深入地讨论了这个问题 。 自然的后续问题是“Haskell怎么做?” 那么,GHC特别是有一个types系统扩展称为Impandicative多态性 ,在“Boxytypes”论文中描述。 简而言之,给定一个typesT可以合法地构build一个列表[forall a. T a => a] [forall a. T a => a] 。 给定这种forms的声明,编译器会做一些字典传递的魔法,让我们在运行时保留对应于列表中每个值types的types实例。 事情是,“字典传递魔法”听起来很像“vtables”。 在像Scala这样的面向对象语言中,子types比“Boxytypes”方法更简单,更自然。 如果我们的A , B和C都扩展特性T ,那么我们可以简单地声明List[T]并且感到高兴。 同样,正如Miles在下面的评论中所指出的那样,如果它们都扩展了T1 , T2和T3特征,那么我可以使用List[T1 with T2 with T3]作为Haskell的等价物[forall a. (T1 a, T2 a, T3 […]

Haskell函数的应用和currying

我总是对学习新的语言感兴趣,这个事实让我感到脚踏实地,让我(我相信)成为一个更好的程序员。 我试图征服Haskell来来去去 – 曾经两次 – 我决定是时候再试一次。 第三次的魅力吧? 不。 我重读了我的旧笔记,并感到失望:-( 上次让我失去信心的问题很简单:整数的排列。 即从整数列表到列表列表 – 它们的排列列表: [int] -> [[int]] 这实际上是一个通用的问题,所以用'a'取代'int'仍然适用。 从我的笔记: 我自己编码,我成功了。 欢呼! 我把我的解决scheme发给我的一个好朋友 – 哈斯克尔大师,通常有助于向大师学习 – 他告诉我,这是我所知道的,“expression了语言的真正力量,使用通用设施来编码需要”。 所有这一切,我最近喝了这个苦工,走吧: permute :: [a] -> [[a]] permute = foldr (concatMap.ins) [[]] where ins x [] = [[x]] ins x (y:ys) = (x:y:ys):[ y:res | res <- ins x ys] 嗯。 […]

什么是应用风格的实际用途?

我是一名Scala程序员,现在正在学习Haskell。 很容易find面向对象概念的实际用例和真实世界的例子,例如装饰器,策略模式等。书籍和网站都充斥着它。 我意识到,这不是function概念的情况。 例如: 应用程序 。 我正在努力寻找应用程序的实际使用案例。 到目前为止,我所遇到的几乎所有的教程和书籍都提供了[]和Maybe的例子。 我希望应用程序比这更适用,看到他们在FP社区的所有关注。 我想我理解申请者的概念基础(也许我错了),而且我已经等待了我的启蒙时刻。 但似乎并没有发生。 从来没有编程,我有一个时刻,我会高兴地喊,“尤里卡!我可以在这里使用应用程序! (除了[]和Maybe )。 有人可以指导我如何在日常编程中使用应用程序吗? 我如何开始发现模式? 谢谢!

将string转换为整数/浮点在Haskell?

data GroceryItem = CartItem ItemName Price Quantity | StockItem ItemName Price Quantity makeGroceryItem :: String -> Float -> Int -> GroceryItem makeGroceryItem name price quantity = CartItem name price quantity 我想在使用String或[String]时创build一个GroceryItem, createGroceryItem :: [String] -> GroceryItem createGroceryItem (a:b:c) = makeGroceryItem abc input的格式是[“Apple”,“15.00”,“5”],我使用haskell中的单词函数进行分解。 我得到这个错误,我认为是因为makeGroceryItem接受一个浮点数和一个整数。 但是,我如何分别做b和c Float和Int? *Type error in application *** Expression : makeGroceryItem a read […]