在Haskell中,我可以轻松地映射列表:
map (\x -> 2*x) [1,2]
Run Code Online (Sandbox Code Playgroud)
给了我[2,4]
.是否有任何"mapTuple"功能可以这样工作?
mapTuple (\x -> 2*x) (1,2)
Run Code Online (Sandbox Code Playgroud)
结果是(2,4)
.
可能重复:
如何判断列表是否无限?
例如,在Haskell中,您可以定义无限列表[1..]
.Haskell中是否有内置函数来识别列表是否具有有限长度?我不认为可以编写用户提供的函数来执行此操作,但Haskell的列表的内部表示可能能够支持它.如果没有标准的Haskell,是否有提供这种功能的扩展?
比较通用集成功能:
template <class F> double integrate(F integrand);
Run Code Online (Sandbox Code Playgroud)
同
template <class F> double integrate(F& integrand);
Run Code Online (Sandbox Code Playgroud)
要么
template <class F> double integrate(const F& integrand);
Run Code Online (Sandbox Code Playgroud)
各自的优点和缺点是什么?STL使用第一种方法(按值传递),是否意味着它是最普遍的方法?
我试图定义一个函数,它将获取一个Double -> Double
函数并返回其数学导数.我尝试过以下操作:
der :: (Double -> Double) -> (Double -> Double)
der f
| f == exp = exp
| otherwise = undefined
Run Code Online (Sandbox Code Playgroud)
但哈斯克尔不支持==
的Double -> Double
值.我在Haskell尝试做什么是不可能的?
C++ 0x中新的"枚举类"声明是否允许切换新的枚举?
我问的是标准说的是什么,而不是编译器的支持.
如何向Haskell数据构造函数添加输入检查?让我说我有
import Data.Time.Calendar
data SchedulePeriod = SchedulePeriod { startDate :: Day
, endDate :: Day
, accrualStart :: Day
, accrualEnd :: Day
, resetDate :: Day
, paymentDate :: Day
, fraction :: Double }
deriving (Show)
Run Code Online (Sandbox Code Playgroud)
我想强加一个约束startDate < endDate
.有没有办法在不创建抽象数据类型的情况下执行此操作?
这个FAQ说明了这一点
seq运算符是
Run Code Online (Sandbox Code Playgroud)seq :: a -> b -> b
x
seq
y将评估x,足以检查它是否为底部,然后丢弃结果并评估y.这可能看起来没什么用,但这意味着在考虑y之前保证会对x进行求值.
这对Haskell来说非常好,但它是否意味着在
x `seq` f x
Run Code Online (Sandbox Code Playgroud)
评估费用x
将支付两次("丢弃结果")?
我已经定义了一种类型
data Expr =
Const Double
| Add Expr Expr
| Sub Expr Expr
Run Code Online (Sandbox Code Playgroud)
并将其声明为Eq
类型类的实例:
instance Eq Expr where
(Add (Const a1) (Const a2)) == Const b = a1+a2 == b
(Add (Const a1) (Const a2)) == (Add (Const b1) (Const b2)) = a1+a2 == b1 + b2
Run Code Online (Sandbox Code Playgroud)
当然,表达式的评估Sub (Const 1) (Const 1) == Const 0
将失败.如何在运行时调试模式匹配过程以发现它失败?我想看看Haskell如何获取参数==
并遍历模式.有可能吗?
在我的C++代码中,我不使用声明using namespace std;
或using namespace boost;
.这使我的代码更长,意味着更多的输入.我正在考虑开始使用"使用"声明,但我记得有些人反对这一点.建议的做法是什么?标准和助力是如此常见,那应该没有太大的伤害?
以下代码:
import Control.Exception
import Data.List
updateAverage :: (Fractional t) => (t, t) -> t -> (t, t)
updateAverage (old_value, old_counter) x =
let new_counter = old_counter + 1
in
assert(new_counter /= 0)
old_value `seq` (old_value + (x - old_value) / new_counter, new_counter)
average values = fst (foldl' updateAverage (0.0, 0.0) values) -- version I
main = do
let v = [1 .. 1000000]
let a = average v
putStrLn (show a)
Run Code Online (Sandbox Code Playgroud)
ghc.exe -O3
当我用average
函数的定义替换时,变得更快(编译选项:)
average = fst . …
Run Code Online (Sandbox Code Playgroud) haskell ×7
c++ ×3
c++11 ×1
constructor ×1
debugging ×1
enums ×1
equality ×1
list ×1
mapping ×1
performance ×1
seq ×1
strict ×1
templates ×1
tuples ×1
validation ×1