小编Bil*_*kat的帖子

为什么Haskell的Prelude.read没有返回Maybe?

Prelude.read的类型是否有充分的理由

read :: Read a => String -> a
Run Code Online (Sandbox Code Playgroud)

而不是返回一个Maybe值?

read :: Read a => String -> Maybe a
Run Code Online (Sandbox Code Playgroud)

由于字符串可能无法解析Haskell,后者不会更自然吗?

或者甚至是一个Either String a,Left如果没有解析的话会包含原始字符串,如果是的话会Right得到结果?

编辑:

我不是想让其他人为我写一个相应的包装器.只是寻求保证这样做是安全的.

parsing haskell types

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

在Haskell中有效处理稀疏丢失的数据

我正在尝试使用Haskell进行数据分析.因为我的数据集相当大(数十万甚至数百万的观测值),所以我最好使用未装箱的数据结构来提高效率,比如Data.Vector.Unboxed.

问题是数据包含一些缺失值.我想避免将它们编码为"99"或类似,因为这只是一个丑陋的黑客和潜在的错误来源.从我的Haskell新手的角度来看,我可以想到以下选项:

  1. 解压缩Maybe值的盒装矢量.有点像(请纠正错误):
    data myMaybe a = Nothing | Just {-# UNPACK #-} !a
  2. 一个未装箱的(无法使用的)元组向量,其中一个布尔元素表示缺失:
    newtype instance Data.Vector.Unboxed.Vector (MyDatum a) = MyDatum (Data.Vector.Unboxed.Vector (Bool,a))
    这可能与此问题的OP选择的方法相同(模数IntBool),但唯一的答案似乎没有明确解决丢失的问题值/稀疏性(而是关注如何表示整个数组未装箱,而不是作为未装箱矢量的盒装矢量).
  3. 未装箱的向量元组,一个具有值,另一个具有要注入缺失值的索引,或者非缺失值的运行长度,或某些等效信息.如果缺失很少,这可能比选项2更可取.

我试图保持在矢量表示而不是像这样的东西,因为它是稀疏的缺失值,而不是数据.

任何关于这些选项的相对优点/可行性/现成可用性/可能性能的评论,或者确实指向完全不同的替代品,都是受欢迎的!

编辑:

  • 有人指出,答案可能取决于我打算对数据执行什么样的操作.目前,将每个观察值存储在单个向量中而不是每个变量似乎更方便.由于向量中的条目因此将引用不同的变量,因此不太可能出现"折叠"类操作.
  • 我猜测2.如果合适,将在内部自动存储"有效位"矢量àla3.所以3.可以删除?

unboxing haskell missing-data

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

Haskell:迭代状态,如何强制我想要的行为?

这是我在SO上的第一篇文章,我对Haskell相对较新,所以请原谅任何失误或者我的代码不是惯用的!

考虑以下两个直观的描述:a,f(a),f(f(a))......

A. 一个包含以下内容的列表:a,应用f到a,应用f到那个,应用f到那个 ...

B. 一个列表,在第i个位置包含嵌套的应用程序f到a.

我的问题是我试图iterate在Haskell中使用该函数来做A烧毁.我的真实应用是模拟,但下面的人为例子突出了这个问题.

import Control.Monad.State

example :: State Int [[String]]

step :: [String] -> State Int [String]
step l = do
         currentState <- get
         let result = if (currentState == 1)
                          then "foo":l
                          else "bar":l
         put (currentState + 1)
         return result

example = do
          sequence $ take 3 . iterate (>>= step) $ return []
Run Code Online (Sandbox Code Playgroud)

有了这些定义,

evalState example 1
Run Code Online (Sandbox Code Playgroud)

结果是:

[[],["foo"],["bar","bar"]]
Run Code Online (Sandbox Code Playgroud)

显然,iterate,没有一个!因为该 …

iteration haskell loops state-monad

4
推荐指数
1
解决办法
1207
查看次数