在阅读Haskell相关的东西时,我有时会遇到“绑结”的expression,我想我明白它做了什么 ,但不知道如何 。 那么,对这个概念的解释有没有什么好的,基本的和简单的?
说我有这样的数据types: data NumCol = Empty | Single Int | Pair Int Int | Lots [Int] 现在我想从[NumCol]过滤出与给定构造函数匹配的元素。 我可以写下来,比方说: get_pairs :: [NumCol] -> [NumCol] get_pairs = filter is_pair where is_pair (Pair _ _) = True is_pair _ = False 这工作,但它不是通用的。 我必须为is_single , is_lots等写一个单独的函数 我希望我可以写: get_pairs = filter (== Pair) 但是这只适用于不带参数的types构造函数(即Empty )。 所以问题是,我怎么能写一个函数,它接受一个值和一个构造函数,并返回值是否与构造函数匹配?
data Plane = Plane { point :: Point, normal :: Vector Double } data Sphere = Sphere { center :: Point, radius :: Double } class Shape s where intersect :: s -> Ray -> Maybe Point surfaceNormal :: s -> Point -> Vector Double 我也做了Shape Plane和Sphere实例。 我试图将球体和飞机存储在同一个列表中,但它不起作用。 我明白,它不应该工作,因为Sphere和Plane是两种不同的types,但他们都是Shape实例,所以不应该工作? 我如何将形状和平面存储在列表中? shapes :: (Shape t) => […]
对于Haskell所禁止的types,我有相当不错的直觉,就像“impandicative”一样:也就是说,除了->以外,类似于构造函数的参数出现在一个函数中。 但是什么是困境? 什么使它重要? 它与“谓词”有什么关系?
Haskell中的monadic IO构造只是一个约定,还是有一个实现的原因呢? 你不只是FFI到libc.so而是做你的IO,并跳过IO Monad块? 无论如何它会起作用,或者由于Haskell评估懒惰或其他原因,结果是不确定的,比如GHC是IO Monad的模式匹配,然后以特殊方式或其他方式处理它。 什么是真正的原因? 最后你会产生副作用。 那为什么不用简单的方法呢?
说,我想定义一个logging这样的属性: data Attribute = Attribute {name :: String, value :: Any} 这当然不是有效的haskell代码。 但有没有一种types的“任何”,基本上说任何types都可以做? 或者是使用typesvariables的唯一方法? data Attribute a = Attribute {name :: String, value :: a}
虽然我看到了Haskell示例代码中的各种奇怪的东西 – 我从来没有见过一个运算符加上被重载。 有什么特别的吗? 假设我有一个像Pair这样的types,我想要类似的东西 Pair(2,4) + Pair(1,2) = Pair(3,6) 哈斯克尔能做到吗? 我只是好奇,因为我知道它可能在斯卡拉相当优雅的方式。
我习惯于能够像在Python中那样定义可选参数: def product(a, b=2): return a * b Haskell没有默认参数,但是我可以通过使用Maybe获得类似的结果: product a (Just b) = a * b product a Nothing = a * 2 如果你有多个参数,这很快就变得很麻烦。 例如,如果我想要做这样的事情: def multiProduct (a, b=10, c=20, d=30): return a * b * c * d 我将不得不有八个multiProduct的定义来说明所有情况。 相反,我决定这样做: multiProduct req1 opt1 opt2 opt3 = req1 * opt1' * opt2' * opt3' […]
当RTL块包含多个赋值给同一个寄存器时,我无法理解堪萨斯熔岩的行为。 这是版本号1: foo :: (Clock c) => Signal clk Bool foo = runRTL $ do r <- newReg True r := low return $ var r 这performance得如我所料: *Main> takeS 10 foo :: Seq Bool low | low | low | low | low | low | low | low | low | low | ? […]
假设我有许多function: f :: a -> Maybe a g :: a -> Maybe a h :: a -> Maybe a 我想用下面的方式来编写它们:如果f返回Nothing,则计算g。 如果g返回Nothing,则计算h。 如果他们中的任何一个计算Just a,则停止链。 而整个作品(例如f)当然应该返回Maybe a。 这与Maybe monad的典型用法相反,如果返回Nothing则通常停止计算。 链式计算这样的Haskell成语是什么?