我现在和Haskell合作已经有一段时间了,但我远非专家.但我发现编程的功能方法最适合我.
到目前为止,我正在研究一个项目来计算一些严重的东西,比如给定结构辐射的电流和电位.
我跟着Conal Elliott写的博客(这里是一些更多的线性地图),这是非常好的和基础的.
不幸的是,我缺少一个简单的例子:)
更确切地说,我有一条曲线
f:[0,1] in R -> R³
t -> a*e_y + 2*t*e_z
Run Code Online (Sandbox Code Playgroud)
这是(0,a,2*t)处的简单直线.当我想计算f的导数,例如用于曲线的长度,我知道数学结果,这是很简单的(0,0,2),但我要如何做到这一点在Haskell,尤其是与病媒太空包?
我真的很想使用这个库,因为它的功能,这正是我所采取的方法(但我在Haskell之路上并没有那么遥远)
到目前为止我所拥有的是:
{-# LANGUAGE Rank2Types, TypeOperators, FlexibleContexts, TypeFamilies #-}
{-# OPTIONS_GHC -Wall #-}
import Numeric.GSL.Integration
import Data.VectorSpace
import Data.Basis
import Data.Cross
import Data.Derivative
import Data.LinearMap
type Vec3 s = Three s
prec :: Double
prec = 1E-9
f1 :: (Floating s, VectorSpace s, Scalar s ~ s) => s -> s
f1 = id
c1 :: Double …Run Code Online (Sandbox Code Playgroud) GNU bash,版本4.2.24:
$> printf "%.0f, %.0f\n" 48.5 49.5
48, 50
Run Code Online (Sandbox Code Playgroud)
Ruby 1.8.7
> printf( "%.0f, %.0f\n", 48.5, 49.5 )
48, 50
Run Code Online (Sandbox Code Playgroud)
Perl 5.12.4
$> perl -e 'printf( "%.0f, %.0f\n", 48.5, 49.5 )'
48, 50
Run Code Online (Sandbox Code Playgroud)
gcc 4.5.3:
> printf( "%.0f, %.0f\n", 48.5, 49.5 );
48, 50
Run Code Online (Sandbox Code Playgroud)
GHC,版本7.0.4:
> printf "%.0f, %.0f\n" 48.5 49.5
49, 50
Run Code Online (Sandbox Code Playgroud)
维基百科说,这种舍入被称为圆形的一半甚至是:
这是IEEE 754计算功能和运算符中使用的默认舍入模式.
为什么在C,Perl,Ruby和bash中默认使用这种舍入,而不是在Haskell中?
这是某种传统还是标准?如果它是一个标准,为什么它被那些语言使用而不被Haskell使用?什么是四舍五入到均匀的点?
在Haskell中,我们有能力将类型的约束与逻辑和.
考虑以下
type And (a :: Constraint) b = (a, b)
Run Code Online (Sandbox Code Playgroud)
或者更复杂
class (a, b) => And a b
instance (a, b) => And a b
Run Code Online (Sandbox Code Playgroud)
我想知道如何在Haskell中逻辑或两个约束.
我最接近的尝试就是这个,但它并不常用.在这种尝试中,我用标签来表示类型约束,而不是用隐式参数去除它们.
data ROr a b where
L :: a => ROr a b
R :: b => ROr a b
type Or a b = (?choose :: ROr a b)
y :: Or (a ~ Integer) (Bool ~ Integer) => a
y = case ?choose of
L -> 4
x :: Integer
x …Run Code Online (Sandbox Code Playgroud) ghci> :t (>>=)
(>>=) :: Monad m => m a -> (a -> m b) -> m b
Run Code Online (Sandbox Code Playgroud)
为什么第二个论点(a -> m b)不是(m a -> m b)甚至是(a -> b)?这是什么概念有关单子需要此签名?具有替代签名的类型类是否有意义t a -> (t a -> t b) -> t b.t a -> (a -> b) -> t b?
我正在尝试编写一些代码,直到本地时区的下一分钟开始,但是我很难这样做.该time库一直是我的弱点之一,因此我假设有一些简单的方法来做到这一点.
我想过只计算一个新的TimeOfDay,但这不会处理23:59到00:00,并且可能会在夏令时切换时做很混乱的事情.
处理闰秒也是一个很好的奖励.
使用Control.Concurrent.threadDelay进行睡眠对我来说似乎是最简单的方法,所以另一个问题是:如何在下一分钟开始之前获得微秒数?DiffTime并且NominalDiffTime将是完全可以接受的方式来实现这一点.
我看了这个:
http://hackage.haskell.org/trac/ghc/wiki/ViewPatterns
我喜欢这个想法,想要使用扩展名.但是我想确定一件事:是否对单个匹配评估了一次视图函数.
所以我们说:
{-# LANGUAGE ViewPatterns #-}
...
f (view -> Nothing) = ...
f (view -> Just x) = ...
view :: a -> Maybe b
Run Code Online (Sandbox Code Playgroud)
现在让我说我调用f a.view对于给定的参数,是调用两次还是只调用一次a?
编辑:
我试图找出是否是这种情况并写下以下内容:
{-# LANGUAGE ViewPatterns #-}
import System.IO.Unsafe
blah (ble -> Nothing) = 123
blah (ble -> Just x) = x
ble x = unsafePerformIO $ do
putStrLn $ "Inside ble: " ++ show x
return x
main :: IO ()
main = …Run Code Online (Sandbox Code Playgroud) 我有这个例子:
$array['one'][0] = 0;
$array['one'][1] = 1;
$array['one'][2] = 2;
$array['one'][3] = 3;
$array['two'][0] = 00;
$array['two'][1] = 11;
$array['two'][2] = 22;
$array['two'][3] = 33;
Run Code Online (Sandbox Code Playgroud)
我怎样才能将它们混合起来以获得类似的东西:
$array['one'][0] = 2;
$array['one'][1] = 1;
$array['one'][2] = 3;
$array['one'][3] = 0;
$array['two'][0] = 22;
$array['two'][1] = 11;
$array['two'][2] = 33;
$array['two'][3] = 00;
Run Code Online (Sandbox Code Playgroud)
或者任何其他随机顺序,但两者中都有相同的"随机因素"?
例如,我想要那个$array['one'][0]并且$array['two'][0]得到洗牌以获得$array['one'][x]和$array['two'][x](x作为随机密钥,但两个阵列上的SAME).
我正在尝试Conduit使用attoparsec解析器编写一个.具体来说,给定parseOne :: Parser T,我想构造一个Conduit ByteString m T重复将解析器应用于输入并流式传输结果的方法.
attoparsec-conduit提供sinkParser把a Parser变成a Sink,但我怎么能把它Sink变成a Conduit?我正在寻找的功能如下:
conduitSink :: (Resource m) => Sink a m b -> Conduit a m b
Run Code Online (Sandbox Code Playgroud)
它反复将数据输入到数据中Sink,随着时间的推移产生每个结果.看起来它可以很容易地写成手动循环,但我想知道是否有更好的方法.
导管库中缺乏这个看似明显的功能让我觉得我可能做错了什么; 有没有更好的方法来实现这一目标?用例是将原始字节转换为基于消息的网络协议的解析形式,由管道的后续阶段处理.我已经有相反的方向(即Conduit T m ByteString)感谢blaze-builder-conduit,所以这似乎是构建事物的最自然的方式.
我最近一直在使用Haskell,几天前使用MacPorts安装了gtk2hs(一个用于Haskell的gtk库).出于某种原因,MacPorts认为适合安装GHC 6.10而不是之前的GHC 6.12安装,但我并不在意.
现在我发现自己希望改进最新的Haskell平台的并行性支持,所以我今天安装了它,并且安装成功 - 除了当我在终端输入"ghc -v"时,我被告知我还有GHC 6.10.
我尝试过使用uninstall-hs,它告诉我我的系统上有三个Haskell:版本6.12,6.12.3和7.04.我不确定6.12.3是如何出现的,以及6.10发生了什么?最重要的是,如何开始运行7.04版本?在此先感谢您的帮助!
我正在尝试在运行时(我必须这样做)连接函数,这可能涉及函数的输入和输出中的类型类约束.
在像Java这样的语言中,这将是微不足道的.f1 :: Int -> Num,f2 :: Num -> Num我们现在可以打电话了f2 . f1.如果Num是一个Java风格的界面,那将没有问题.但类型类的行为不像接口.
类型类允许您做的一件事是避免在数据类型之间进行转换.我们可以来回转换并摆脱类型类.但令人担忧的是,我们无缘无故地创造了所有物品.我们试着避免这种情况.
我开始尝试创建一个(a,Api a)的元组,其中Api是一个将在a上运行的函数的记录.我的猜测可能与类型类的工作方式非常相似?但是你遇到了混凝土类型问题,我认为存在.但后来我意识到(a,Api a)应该能够完全隐藏a,因为没有人关心,然后Api变成了数据类型的简单记录,而不是函数.
所以我想知道......是否解决了这种懒惰?
module Main where
--data Api a = Api { f1 :: a -> Int, f2 :: a -> String }
data Api = Api { f1 :: Int, f2 :: String }
data MyData = MyData Int String
myf1 (MyData x y) = x
myf2 (MyData x y) = y
myApi x = Api (myf1 x) (myf2 …Run Code Online (Sandbox Code Playgroud)