我有一个具有以下结构的包(好吧,这是大大简化,但......)
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) 对于NxP矩阵x和yN> 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) 我有一个实用程序函数,它枚举了一个可枚举和有界的类型的所有值:
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) 在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)
但是,类型检查器接受第二个但拒绝第一个.这是为什么?
假设我有一些相当简单的数据类型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)
看来我这样做的两个选择是使用at或ix索引到字典中
-- 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的初学者.
根据我的学校资料在功能定义中使用的惯例实际上如下
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函数定义中使用传统的数学约定吗?
如果错了,在哪些特定情况下会出错?
提前致谢 :)
假设我有以下两个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?
我正在尝试编写一些Haskell代码,其中有多种数据类型,每种类型都可以有多个实现.为此,我将每个数据类型定义class为其方法是相关的构造函数和选择器,然后根据给定的构造函数和选择器对该类的成员实现所有操作.
例如,也许A是多项式类(方法getCoefficients和makePolynomial),其可以具有表示作为SparsePoly或DensePoly和B是复数类(方法getReal,getImag并且makeComplex其可被表示为一个)ComplexCartesian或一个ComplexPolar.
我在下面复制了一个最小的例子.我有两个类A,B每个类都有一个实现.我想将这两个类的所有实例都Num自动化为实例(这需要FlexibleInstances和UndecidableInstances类型扩展).这个工作正常,当我只有一个A或B,但当我尝试与两者编译时,我得到以下错误:
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) 我有一个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(我的印象并不是太令人担忧,例如看到这个问题)但是我想知道将延续变换器变成一个实例是否有困难 …
有人可以向我解释这个编码.
[ x*y | x <- [2,5,10], y <- [8,10,11], x*y > 50]
Run Code Online (Sandbox Code Playgroud)
我不明白这个|的含义 哈斯克尔的象征