Haskell:读取包含Int和Float的行的简单方法?

时间:2014-01-12 14:37:21

标签: haskell

我想从一个看起来像这样的文件中读取行:

1 2.1
2 2.2
3 2.3

每行都有一个简单的Int和Float

这就是我想出来的,阅读每一行:

readFoo :: String -> (Int, Float)
readFoo line = (read (splitOn " " line !! 0), read (splitOn " " line !! 1))

或者我也做了一个数据类型,然后read部分很简单。

data Foo = Foo Int Float deriving (Show, Read)
getM (Foo m p) = m
getP (Foo m p) = p

readFoo :: String -> Foo
readFoo line = read $ "Foo " ++ line :: Foo

但必须有一种更简单的方法,对吗?

1 个答案:

答案 0 :(得分:10)

表达此问题的一种巧妙方法是使用ViewPatterns扩展程序

{-# LANGUAGE ViewPatterns #-}

readFoo :: String -> (Int, Float)
readFoo (words -> [read -> i, read -> f]) = (i ,f)

在标准Haskell中编写它的另一种方法是例如。

readFoo :: String -> (Int, Float)
readFoo ln = (read i, read f) where
    [i, f] = words ln

当然,所有这些都假定您不关心错误处理。