小编ehi*_*ird的帖子

衍生塔以及如何使用矢量空间包(haskell)

我现在和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)

haskell

14
推荐指数
1
解决办法
831
查看次数

奇怪的"一半甚至"四舍五入用不同的语言

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使用?什么是四舍五入到均匀的点?

c ruby bash perl haskell

12
推荐指数
2
解决办法
1424
查看次数

如何将两个类型约束与逻辑或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)

haskell typeclass type-constraints

12
推荐指数
1
解决办法
624
查看次数

绑定函数中的不对称

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

monads haskell

11
推荐指数
5
解决办法
786
查看次数

睡到下一分钟的开始

我正在尝试编写一些代码,直到本地时区的下一分钟开始,但是我很难这样做.该time库一直是我的弱点之一,因此我假设有一些简单的方法来做到这一点.

我想过只计算一个新的TimeOfDay,但这不会处理23:59到00:00,并且可能会在夏令时切换时做很混乱的事情.

处理闰秒也是一个很好的奖励.

使用Control.Concurrent.threadDelay进行睡眠对我来说似乎是最简单的方法,所以另一个问题是:如何在下一分钟开始之前获得微秒数?DiffTime并且NominalDiffTime将是完全可以接受的方式来实现这一点.

time haskell

11
推荐指数
1
解决办法
2953
查看次数

ViewPatterns和Haskell中的多个调用

我看了这个:

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)

haskell functional-programming ghc language-extension

11
推荐指数
1
解决办法
478
查看次数

以相同的方式洗牌2个php阵列

我有这个例子:

$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).

php arrays random shuffle

8
推荐指数
2
解决办法
3777
查看次数

如何将水槽变成管道?

我正在尝试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 conduit

7
推荐指数
1
解决办法
675
查看次数

如何在以前的安装中安装Haskell平台?

我最近一直在使用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版本?在此先感谢您的帮助!

macos install haskell

6
推荐指数
1
解决办法
2204
查看次数

键入类和记录作为接口

我正在尝试在运行时(我必须这样做)连接函数,这可能涉及函数的输入和输出中的类型类约束.

在像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)

haskell typeclass

6
推荐指数
1
解决办法
613
查看次数