在阅读了介绍传感器的Clojure(http://blog.podsnap.com/ducers2.html)上的这篇文章之后,我对传感器的含义感到困惑.是否部分应用于mapHaskell,如map (+1)传感器?起初我认为这是使用部分应用程序的Clojure方式,但随后本文继续在Haskell中使用显式类型实现它.它在Haskell中有什么用?
引用@dfeuer对这个问题的回答:在Haskell中构造循环列表的最便宜的方法,它说使用循环列表"击败"垃圾收集器,因为它必须保留你从循环列表中分配的所有内容,直到你删除引用列表中的任何缺点单元格.
显然在Haskell中,循环列表和无限列表是两个独立的事物.这篇博客(https://unspecified.wordpress.com/2010/03/30/a-doubly-linked-list-in-haskell/)说如果你实现cycle如下:
cycle xs = xs ++ cycle xs
Run Code Online (Sandbox Code Playgroud)
它是一个无限列表,而不是循环列表.要使它循环,你必须像这样实现它(如Prelude源代码中所示):
cycle xs = xs' where xs' = xs ++ xs'
Run Code Online (Sandbox Code Playgroud)
这两种实现之间究竟有什么区别?为什么如果你在循环列表中的某个地方持有一个cons小区,垃圾收集器必须在分配之前保留所有内容?
如果我有类似的类型data T = T Int String和这样的函数:
identity :: T -> T
identity (T a b) = T a b
Run Code Online (Sandbox Code Playgroud)
在模式匹配中解构之后,GHC是否创建了一个包含对同一个Int和String的引用的新T对象?或者它返回它收到的完全相同的对象(具有相同的内存地址)?我知道他们在语义上是等价的,我只是好奇.
如果我将此常量pascal定义为
pascal :: [[Int]]
pascal = iterate newrow [1]
where newrow = (zipWith (+) <*> tail) . ([0]++) . (++[0])
Run Code Online (Sandbox Code Playgroud)
我pascal !! 50 !! 50在GHCI中评估,这个三角形的大部分是什么?这种懒惰是否意味着只计算必要的值(加上一堆thunk)?
嘿所以我正在阅读关于Java中类型驱动开发的这篇文章.我无法学习Java类型,所以我尝试在Haskell中编写它.但是,我有两个问题:
data Dollar = Dollar Double,价值就像Dollar 4.0货币,Dollar类型就是货币.我认为Dollar :: Double -> Dollar这将是未出口的东西.exchange :: (Money a, Money b) =>[ExchangeRate] -> a -> b.然后银行只是一个包含ExchangeRates集合的对象,但我不知道ExchangeRate是什么类型.我到目前为止的代码是:
class Money m where
money :: (Money m) => Double -> m
amount :: (Money m) => m -> Double
add :: (Money m) => m -> m -> m
add a b = money $ amount a + amount b
class (Money a, Money …Run Code Online (Sandbox Code Playgroud) 据我所知,Haskell只有当某些东西超出范围时才会收集垃圾,因此顶级绑定只会被评估一次并且永远不会超出范围.因此,如果我在GHCI中运行此代码,将评估并保存前50个元素.
let xs = map f [0..]
take 50 xs
Run Code Online (Sandbox Code Playgroud)
我的问题是当我执行以下代码段时会发生什么:xs !! 99.垃圾收集器保存了什么?可以
在Haskell中,尽可能在高阶函数(如折叠,贴图和展开)中编写尽可能多的代码是惯用的.那么哪些代码不能用那些高阶函数编写?何时需要显式递归?
它非常常见,我遇到了一些元素列表,xs并希望对每个第N个元素做一些事情.最简单的例子是Sieve或Erastothenes,你想要"敲掉"给定素数的每一个倍数.我可以这样做的两种方法是通过计数器变量传递显式递归; 或zipWith ($) (cycle (replicate (n-1) id ++ f)).那么哪种方式更好/更优雅/更常用,或者是否有一些mapEveryN :: (a -> a) -> Int -> [a] -> [a]我没有找到的库函数?
所以我正在努力将模式与列表匹配,例如:
match "abba" "redbluebluered" -> True或者
match "abba" "redblueblue" -> False等等.我写了一个有效的算法,我认为这是合理可行的,但我不确定是否有更好的方法这样做没有明确的递归.
import Data.HashMap.Strict as M
match :: (Eq a, Eq k, Hashable k) => [k] -> [a] -> HashMap k [a] -> Bool
match [] [] _ = True
match [] _ _ = False
match _ [] _ = False
match (p:ps) s m =
case M.lookup p m of
Just v ->
case stripPrefix v s of
Just post -> match ps post m
Nothing -> …Run Code Online (Sandbox Code Playgroud) 假设我有一种货币类型:
data Currency = USD | EUR | YEN
Run Code Online (Sandbox Code Playgroud)
和存储int的Money类型,并由给定的Currency参数化(Currency被提升为具有DataKinds扩展名的类型).
data Money :: Currency -> * where
Money :: Int -> Money c
Run Code Online (Sandbox Code Playgroud)
是否可以编写一个函数,该函数moneyOf以其参数为货币值,并返回一个Money值,该值由相应的Currency值类型参数化?比如moneyOf :: Currency -> Money c,但我们得到的编译时保证c是从Currency值生成的类型?
haskell ×10
recursion ×2
types ×2
clojure ×1
coding-style ×1
data-kinds ×1
fold ×1
ghc ×1
idioms ×1
infinite ×1
list ×1
repeat ×1
transducer ×1