小编Chr*_*lor的帖子

在cabal构建中包含数据文件

我有一个具有以下结构的包(好吧,这是大大简化,但......)

app/
  src/
    Main.hs
  data/
    data.txt
  app.cabal
  Paths_app.hs
  Setup.hs
Run Code Online (Sandbox Code Playgroud)

在Paths_app.hs我有:

module Paths_app where
getDataFileName :: FilePath -> IO FilePath
getDataFileName = return
Run Code Online (Sandbox Code Playgroud)

在Main.h中我有:

module Main where
import Paths_app
main = do
    file <- getDataFileName "data/data.txt"
    data <- readFile file
    putStrLn $ "Your data is: " ++ data
Run Code Online (Sandbox Code Playgroud)

我的app.cabal文件的相关部分如下所示:

name: app
version: 1.0
build-type: Simple
data-files: data/data.txt

executable foo
  build-depends: base, haskell98
  main-is: Main.hs
  hs-source-dirs: src
Run Code Online (Sandbox Code Playgroud)

这构建正常(使用cabal configure后跟cabal install)但可执行文件抱怨它找不到data.txt文件.我试过更换线路

file <- getDataFileName "data/data.txt"
Run Code Online (Sandbox Code Playgroud)

file <- getDataFileName …
Run Code Online (Sandbox Code Playgroud)

haskell cabal

8
推荐指数
1
解决办法
2000
查看次数

为什么x\y比(x'*x)\(x'*y)慢得多?

对于NxP矩阵xyN> 1的Nx1向量,这两个表达式

x \ y                                       -- (1)
Run Code Online (Sandbox Code Playgroud)

(x' * x) \ (x' * y)                         -- (2)
Run Code Online (Sandbox Code Playgroud)

两者都计算b矩阵方程的解

x * b = y
Run Code Online (Sandbox Code Playgroud)

在最小二乘意义上,即使数量

norm(y - x * b)
Run Code Online (Sandbox Code Playgroud)

最小化.表达式(2)使用经典算法来解决普通最小二乘回归,其中\运算符的左手参数是正方形.它相当于写作

inv(x' * x) * (x' * y)                      -- (3)
Run Code Online (Sandbox Code Playgroud)

但它使用的算法在数值上更稳定.事实证明,(3)比(2)适度快,即使(2)不必产生作为副产物的逆矩阵,但我可以接受给定额外的数值稳定性.

然而,一些简单的时间(N = 100,000和P = 30)表明表达式(2)比表达式(1)快5倍以上,即使(1)具有更大的灵活性来选择所使用的算法!例如,对(1)的任何调用都可以调度X的大小,在N> P的情况下,它可以减少到(2),这会增加很少的开销,但肯定不会花费5倍更长的时间.

表达式(1)中发生了什么导致它花了这么长时间?


编辑:这是我的时间

x = randn(1e5, 30);
y = randn(1e5,1);
tic, for i = 1:100; x\y; end; t1=toc;
tic, for i = 1:100; (x'*x)\(x'*y); end; t2=toc; …
Run Code Online (Sandbox Code Playgroud)

performance matlab

7
推荐指数
2
解决办法
142
查看次数

生成与枚举类型关联的Ints列表

我有一个实用程序函数,它枚举了一个可枚举和有界的类型的所有值:

enumerate :: (Enum a, Bounded a) => [a]
enumerate = [minBound .. maxBound]
Run Code Online (Sandbox Code Playgroud)

以及涉及将可枚举类型映射到整数的数据类型:

data Attribute a = Attribute { test :: a -> Int
                             , vals :: [Int]
                             , name :: String }
Run Code Online (Sandbox Code Playgroud)

vals表示所有可能的可枚举值的整数列表在哪里.例如,如果我有

data Foo = Zero | One | Two deriving (Enum,Bounded)
Run Code Online (Sandbox Code Playgroud)

vals就是[0,1,2].

我希望能够以编程方式创建这些属性,只需给出一个映射a到可枚举类型和名称的函数.像这样的东西:

attribute :: (Enum b, Bounded b) => (a -> b) -> String -> Attribute a
attribute f str = Attribute (fromEnum . f) vs str …
Run Code Online (Sandbox Code Playgroud)

haskell types

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

编译类型和newtype之间的时间和运行时间差异

在read-compile-run管道的各个阶段,type声明和newtype声明之间有什么区别?

我的假设是他们编译成相同的机器指令,唯一的区别是当程序被类型检查时,例如

type    Name  =   String
newtype Name_ = N String
Run Code Online (Sandbox Code Playgroud)

您可以使用Name在任何地方一个String是必需的,但如果你使用的typechecker会打电话给你了Name_,其中一个String是预期的,即使它们编码相同的信息.

我问这个问题是因为,如果是这种情况,我认为没有任何理由说明以下声明不应该有效:

type    List a  =    Either () (a, List a)
newtype List_ a = L (Either () (a, List_ a))
Run Code Online (Sandbox Code Playgroud)

但是,类型检查器接受第二个但拒绝第一个.这是为什么?

haskell types

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

使用`at`和`ix`编写镜头

假设我有一些相当简单的数据类型Person,包含几个字段,以及一个包含Persons 集合的类型.

data Person = Person { _name :: String, _age  :: Int }

data ProgramState = PS { _dict :: IntMap Person }

makeLenses ''Person
makeLenses ''ProgramState
Run Code Online (Sandbox Code Playgroud)

我想创建一个镜头,让我通过查找他们的密钥来访问个人

person :: Int -> Lens' ProgramState Person
Run Code Online (Sandbox Code Playgroud)

看来我这样做的两个选择是使用atix索引到字典中

-- Option 1, using 'at'
person :: Int -> Lens' ProgramState (Maybe Person)
person key = dict . at key

-- Option 2, using 'ix'
person :: Int -> Traversal' ProgramState Person
person key = …
Run Code Online (Sandbox Code Playgroud)

haskell traversal haskell-lens

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

Haskell函数定义约定

我是Haskell的初学者.

根据我的学校资料在功能定义中使用的惯例实际上如下

function_name arguments_separated_by_spaces = code_to_do

例如:

f a b c = a * b +c
Run Code Online (Sandbox Code Playgroud)

作为一名数学学生,我习惯于使用如下的功能

function_name(arguments_separated_by_commas)= code_to_do

例如:

f(a,b,c) = a * b + c
Run Code Online (Sandbox Code Playgroud)

它在Haskell工作.

我怀疑它是否适用于所有情况?

我的意思是我可以在Haskell函数定义中使用传统的数学约定吗?

如果错了,在哪些特定情况下会出错?

提前致谢 :)

haskell function

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

使用Jackson读取JSON标量作为单元素double []

假设我有以下两个JSON文件

{
  "a": [1, 2]
}
Run Code Online (Sandbox Code Playgroud)

{
  "a": 1
}
Run Code Online (Sandbox Code Playgroud)

我想用杰克逊将它们反序列化为以下形式的对象 -

public class Foo {
    public double[] a;
}
Run Code Online (Sandbox Code Playgroud)

所以我最终得到两个对象,Foo{a=[1,2]}并且Foo{a=[1]}.是否有可能说服杰克逊将标量反序列化为1双数组[1],最好使用jackson-databind api?

java json jackson

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

有趣的类型!解决多个实例声明

我正在尝试编写一些Haskell代码,其中有多种数据类型,每种类型都可以有多个实现.为此,我将每个数据类型定义class为其方法是相关的构造函数和选择器,然后根据给定的构造函数和选择器对该类的成员实现所有操作.

例如,也许A是多项式类(方法getCoefficientsmakePolynomial),其可以具有表示作为SparsePolyDensePolyB是复数类(方法getReal,getImag并且makeComplex其可被表示为一个)ComplexCartesian或一个ComplexPolar.

我在下面复制了一个最小的例子.我有两个类A,B每个类都有一个实现.我想将这两个类的所有实例都Num自动化为实例(这需要FlexibleInstancesUndecidableInstances类型扩展).这个工作正常,当我只有一个AB,但当我尝试与两者编译时,我得到以下错误:

Duplicate instance declarations:
  instance [overlap ok] (A a, Num x, Show (a x), Eq (a x)) =>
                        Num (a x)
    -- Defined at test.hs:13:10-56
  instance [overlap ok] (B b, Num x, Show (b x), Eq (b x)) =>
                        Num …
Run Code Online (Sandbox Code Playgroud)

haskell types type-extension

5
推荐指数
2
解决办法
3246
查看次数

为什么ContT不能成为MonadError的实例?

我有一个monad变压器堆栈,包括一个ErrorT,我想ContT r围绕整个事情包装一个变压器.当我尝试这样做时,我调用throwError生成类型错误 - 显然ContT r不是自动的实例MonadError.好吧,我想 - 我会把它变成一个:

instance MonadError e m => MonadError e (ContT r m) where
  throwError = lift . throwError
  catchError = liftCatch . catchError
Run Code Online (Sandbox Code Playgroud)

使用一些合适的定义liftCatch.但是现在我在编译时遇到错误:

src\Language\Types.hs:68:10:
    Illegal instance declaration for `MonadError e (ContT r m)'
      (the Coverage Condition fails for one of the functional dependencies;
       Use -XUndecidableInstances to permit this)
    In the instance declaration for `MonadError e (ContT r m)'
Run Code Online (Sandbox Code Playgroud)

我很高兴使用UndecidableInstances pragma(我的印象并不是太令人担忧,例如看到这个问题)但是我想知道将延续变换器变成一个实例是否有困难 …

monads haskell monad-transformers

5
推荐指数
1
解决办法
375
查看次数

这个符号是什么| 在Haskelll意味着

有人可以向我解释这个编码.

[ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50]
Run Code Online (Sandbox Code Playgroud)

我不明白这个|的含义 哈斯克尔的象征

haskell haskell-platform

5
推荐指数
2
解决办法
251
查看次数