3

a)我需要在haskell中String转换。int我有一个函数可以将句子中的第三个单词作为字符串获取,但是我所有句子中的第三个单词都是数字(int),我怎样才能从字符串转换为 int 以便之后我可以使用该数字进行操作,例如加法还是乘法?

getThirdWord :: String -> String
getThirdWord = head . tail . tail . words

b)我正在使用 Visual Haskell Studio。如何使用Visual Haskell Studio 之类的map功能?zip是否有任何插件需要包含到我的 vhs 中才能使它们工作?

非常感谢您!

4

4 回答 4

14

Yacoby 的回答当然是正确的。让我说两点:

  1. read很一般。它不仅转换StringInt. 它的返回类型取决于上下文。在这种情况下getThirdWord被定义为String -> Int,所以read知道该怎么做。情况并非总是如此,因此如果您在使用 时遇到编译错误read,请记住这一点:您可能需要帮助 Haskell 找出返回类型。
  2. 目前您用于head . tail . tail获取第三个列表元素。如果你想要,比如说,第 23 个元素怎么办?一个更易于维护和可读的解决方案是使用(!!):这样您可以在任何索引处检索列表元素。因此:

    thirdWordAsInt :: String -> Int 
    thirdWordAsInt = read . (!! 2) . words
    

    (注意 2 而不是 3,因为索引是 0 索引的。)

于 2009-11-26T14:23:04.590 回答
6

关于强制转换,看看read函数。

getThirdWord :: String -> Int
getThirdWord = read . head . tail . tail . words

Visual Haskell Studio似乎只是一个IDE,因为后端使用GHC,它完全支持 Haskell 规范并包括包含 map 和 fold 的库。

于 2009-11-26T13:48:26.780 回答
3

我第二次使用 Yacoby read,但请记住head/tailread都是部分函数,​​可能会在空列表上失败。我认为最好避免head使用模式匹配。例如,

get3rd :: String -> String
get3rd s =
  case (take 3 $ words s) of
    [_,_,w]   -> w
    otherwise -> ""

此函数对任何输入都是安全的(如果少于 3 个单词,它只会返回一个空字符串)。当然,如果你绝对确定列表总是非空的,你可以使用head/ tail

read您可以捕获异常(不是很方便),也可以使用reads

toInt :: String -> Maybe Int
toInt s =
  case reads s of
    [(i,_)]   -> Just i
    otherwise -> Nothing

-- test cases
main = do
  print . toInt . get3rd $ "1 2 3"
  print . toInt . get3rd $ "one two three"
  print . toInt . get3rd $ "short list"

toInt将返回Just一个数字,或者Nothing如果它无法解析。或者,您可以使用Safe 库及其readMay功能。

于 2009-11-26T16:10:52.923 回答
0

你们都很好,但我发帖是因为我认为我在学习帮助阅读显示文本 时想出了一个非常优雅和有用的功能。

as :: (Read a, Show a) => (a -> a) -> String -> String
as f = show . f . read

Prelude> as (+1) "7"
"8"

Prelude> as (+(1/2)) "5"
"5.5"

有用,嗯?=P。还有xs!!n获取 xs 的第 n 个元素。查看其他答案以获得简单的打印方法。

于 2009-11-26T17:07:21.840 回答