在面向对象的语言(例如Java和Python)中,我们可以从类中生成对象/实例。在Haskell中,我们可以从类型类中创建实例,例如:
data ShirtSize = S | M | L -- Here ShirtSize is a enum data-type
class MyEq a where
(==) :: a -> a -> Bool
instance MyEq ShirtSize where -- Here ShirtSize is an instance of the MyEq type-class
S == S = True
M ==
刚刚开始使用Haskell,据说Haskell有不可变的变量。那么,为什么每次在GHCi提示符中输入一个表达式时,'it‘变量都会一直改变它的值?
GHCi, version 7.10.2: http://www.haskell.org/ghc/ :? for help
Prelude> 7*2
14
Prelude> it
14
Prelude> "foo"
"foo"
Prelude> it
"foo"
Prelude>
模板Haskell能否找到类型类中声明的关联类型同义词的名称和/或声明?我原以为会做我想做的事,但它似乎并没有提供所有必要的信息。它用于获取函数类型签名:
% ghci
GHCi, version 7.8.3: http://www.haskell.org/ghc/ :? for help
...
Prelude> -- I'll be inserting line breaks and whitespace for clarity
Prelude> -- in all GHCi output.
Prelude> :set -XTemplateHaskell
Pr
我是一个Scala程序员,学习Haskell和"Haskell编程从首要原则“,使我在Scala中使用的功能概念更加一致。
我非常理解赛跑的概念。在Scala中很好地实现了它。
然而,我不理解提交人所提供的仓促和取消仓促的实施:
curry f a b = f (a, b)
:t curry
-- curry :: ((t1, t2) -> t) -> t1 -> t2 -> t
:t fst
-- fst :: (a, b) -> a
:t curry fst
-- curry fst :: t -> b -> t
uncurr
我刚接触函数式编程和Haskell,并且很难理解自己的数据类型的构造。作为一个学习资源,我一直在使用http://learnyouahaskell.com/,但我仍然无法掌握一些想法。 我的具体问题是,我正在尝试为我的自定义数据类型创建一个show实例,它总是在所显示的内容前面显示'+‘符号(在我的例子中,输入555将是"+555")。这就是我一直试图解决的问题。 data CountryCode = CountryCode Integer deriving Eq
instance Show CountryCode where
show _ = "+
我在Haskell wiki中找到了"Bresenham's line drawing algorithm“的代码,但是,我不容易理解开头的部分,所以我重写了它。但当斜率超过1/2时,我无法绘制直线。以下是我的部分代码。
line :: Point -> Point -> [Point]
line (x0,y0) (x1,y1)
| abs (y1-y0) > abs(x1-x0) = line (y0,x0) (y1,x1)
| x0 > x1 = line (x1,y1) (x0,y0)
| otherwise
冈崎使用(本质上)
data Color = R | B
data RB a = L | T {-# UNPACK #-}!Color !(RB a) !a !(RB a)
我知道,在C中,颜色通常是以一种更精细的方式处理,以节省空间,例如使指针的低位表示颜色(我认为指向节点的指针通常会编码其颜色,但也可以通过使节点的左右指针表示其颜色来模仿Okasaki的结构)。
很明显,在哈斯克尔,这样的摆弄是不可能的。那么,如何在Haskell中最有效地表示节点呢?
data RB' a = L | B !(RB a) !a !(RB a) | R !(RB a) !a !(RB a)
似乎是合
我正在努力做Coursera课程,同时学习Haskell,但我现在被困了几个小时,试图编译我正在进行的工作。我已经尝试过在GHCi中模拟其中的大部分内容,这是可行的,但是我一直得到一个类型错误。会欢迎有经验的眼睛
Couldn't match expected type `Int -> [Int] -> Bool'
with actual type `Int'
The operator `elem' takes two arguments,
but its type `Int' has n
据我所知,函子是两个类别之间的映射,例如
中的对象
哪里
和
都是类别。
在Haskell中有Hask,其中对象是Haskell类型,而态射是Haskell函数。但是,Functor类型类有一个函数fmap,它在这些类型之间映射(因此是对象,而不是类别本身):
fmap :: (a -> b) -> f a -> f b
f a和f b都是Hask中的对象。这是否意味着Haskell中的每个Functor实例都是一个函数,如果不是,Functor是否真的表示一个函子?
我在这里错过了什么?类型也在Haskell中吗?
在Haskell堆中,下面的值/表达式/函数的块是什么样子的?
val = 5 -- is `val` a pointer to a box containing 5?
add x y = x + y
result = add 2 val
main = print $ result
考虑到Haskell的惰性评估模式,如果能了解这些内容在Haskell中是如何表示的,那就太好了。
我很难理解UNPACK在Haskell中是如何工作的。例如,考虑以下数据声明:
data P a b = P !a !b
data T = T {-# UNPACK #-} !(P Int Int)
数据类型T将如何解包?它是否等同于
data T' = T' !Int !Int
或者,Int将被进一步拆解:
data T'' = T'' Int# Int#
?关于
data U = U {-# UNPACK #-} !(P Int (P Int Int))
我正在编写一个应用程序,它与一个大型(10-1000GB)内存映射的二进制文件进行交互,基本上包含一组相互引用的对象。我提出了一种读取/写入这些数据的机制,它是有效的,但又丑陋又冗长(imo)。
问:有什么更优雅的方法来达到我所做的吗?
我有一个结构化数据的类型类型,有一种方法可以将结构读入Haskell数据类型(DataOp是围绕IO的ReaderT )。
class DBStruct a where
structRead :: Addr a -> DataOp a
为了提高这一点的可读性,我有另一个类型库,它定义了成员所在的结构:
class DBStruct st =>
我对函数式的使用感到困惑
Functor是否用于定义映射的属性,以及如何在Haskell中编写映射的属性?
如果是这样的话,haskell是否可以在编写定义后用于生成函数或其他东西
类型或类声明的报头格式不正确:流x y
import Control.Applicative
class flow x y where { f :: x y -> x; } // this line i do not know whether is enforced to write
// how to write thi
我在使用FP2 for eclipse并让它与服务器连接时遇到了问题。
Eclipse似乎可以自动检测scion_server,但是我在日志文件中发现了一个错误
!ENTRY net.sf.eclipsefp.haskell.scion.client 4 4 2010-04-15 10:40:06.580
!MESSAGE The connection with the Scion server could not be established.
!STACK 0
The connection with the Scion server could not be established.
如果您正在用Haskell编写生物信息学算法,您可能会使用代数数据类型来表示核苷酸:
data Nucleotide = A | T | C | G
我想,在Standard或OCaml中,您也会这样做(我也从未真正使用过)。
Nucleotide类型的值可以清楚地包含在两个位中。但是,这样做会导致访问时间比使用每个Nucleotide值一个字节时慢,因为您需要使用二进制运算符来选择感兴趣的两位。
因此,在决定如何表示代数数据类型时,编译器必须在内存效率和计算效率之间进行一种固有的权衡。此外,内存中的代数数据类型的表示由于值可以是可变大小而变得更加复杂:
data Maybe a = Just
嗯..。我放弃了:
PS D:\Projects\yesod\webapp> cabal install cabal-dev --force-reinstalls
Resolving dependencies...
Warning: The following packages are likely to be broken by the reinstalls:
haskell-platform-2012.2.0.0
Continuing even though the plan contains dangerous reinstalls.
Configuring network-2.3
类似于How to produce a NaN in Haskell ... 在C中,有一个由math.h定义的INFINITY宏。 同样,在http://hackage.haskell.org/package/ClassyPrelude-0.1/docs/Prelude-Math.html中,我可以看到用来测试信息的错误,但不能用来产生错误。 因此,我唯一的选择是像1/0这样的