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得到结果?
编辑:
我不是想让其他人为我写一个相应的包装器.只是寻求保证这样做是安全的.
我正在尝试使用Haskell进行数据分析.因为我的数据集相当大(数十万甚至数百万的观测值),所以我最好使用未装箱的数据结构来提高效率,比如Data.Vector.Unboxed.
问题是数据包含一些缺失值.我想避免将它们编码为"99"或类似,因为这只是一个丑陋的黑客和潜在的错误来源.从我的Haskell新手的角度来看,我可以想到以下选项:
Maybe值的盒装矢量.有点像(请纠正错误):data myMaybe a = Nothing | Just {-# UNPACK #-} !anewtype instance Data.Vector.Unboxed.Vector (MyDatum a) = MyDatum (Data.Vector.Unboxed.Vector (Bool,a))Int为Bool),但唯一的答案似乎没有明确解决丢失的问题值/稀疏性(而是关注如何表示整个数组未装箱,而不是作为未装箱矢量的盒装矢量).我试图保持在矢量表示而不是像这样的东西,因为它是稀疏的缺失值,而不是数据.
任何关于这些选项的相对优点/可行性/现成可用性/可能性能的评论,或者确实指向完全不同的替代品,都是受欢迎的!
编辑:
这是我在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不乙,没有一个!因为该 …
haskell ×3
iteration ×1
loops ×1
missing-data ×1
parsing ×1
state-monad ×1
types ×1
unboxing ×1