【问题标题】:Couldn't match type IO with Map and couldn't match type Map with [Char]无法将类型 IO 与 Map 匹配,也无法将类型 Map 与 [Char] 匹配
【发布时间】:2017-02-26 21:37:06
【问题描述】:

我是 Haskell 的新手,下面的代码给了我两个错误:

import Control.Monad
import Control.Applicative
import System.IO
import qualified Data.Map as Map
import Data.Maybe

main = do
    return ()

getPhonebook :: Int -> (Map.Map String String)
getPhonebook n
    | n == 0 = Map.empty
    | otherwise = do
        line <- getLine
        let split = words line
        return (Map.insert (split !! 0) (split !! 1) (getPhonebook (n-1)))

第一个错误在line &lt;- getLine 行。错误显示Couldn't match type ‘IO’ with ‘Map.Map String’。我不明白这个错误,可能是一个愚蠢的错误。

第二个错误在返回线上。它说Couldn't match type ‘Map.Map String String’ with ‘[Char]’,预期的类型是[Char]。我不明白这一点,因为该函数应该返回一个地图,但它要求[Char]

任何帮助将不胜感激:D

【问题讨论】:

    标签: haskell types


    【解决方案1】:

    您将纯代码与不纯代码混合在一起 - 这可能在不太严格的编程语言中有效,但 haskell 让您“标记”IO 的每次使用 - 通过将您置于 IO monad 中(有不安全的方法解决这个问题 - 所以让我们不关心这些)。

    你承诺给 GHC - getPhonebook :: Int -&gt; (Map.Map String String) 这意味着对于 getPhonebook 域中的每个 Int - 您将返回一个 (Map String String) - pureley,无需任何用户输入。

    现在在函数体中,你没有通过使用getLine 等来履行这个承诺。

    所以让我们更改类型并确认使用 IO。

    getPhonebook :: Int -> IO (Map.Map String String)
    

    现在您的基本情况与 IO 操作不匹配,但可以使用 return ... 轻松解决此问题。

    但 GHC 仍然发现了一个问题 - Map.insert 是纯正的,不会接受 getPhonebook (n-1),因为这现在是一个 IO 操作。如何解决这个问题 - 将此操作绑定到名称 previousPB &lt;- getPhonebook (n-1)

    将这些放在一起,我们得到以下代码:

    getPhonebook :: Int -> IO (Map.Map String String)
    getPhonebook n
      | n == 0 = return Map.empty
      | otherwise = do
            line <- getLine
            let split = words line
            previousPB <- getPhonebook (n-1)
            return $ Map.insert (split !! 0) (split !! 1) previousPB
    

    现在的问题是这到底是做什么的 - 它通过询问您的 n 条目来填写电话簿并将其返回给您 - 这是您想要它做的吗? - 我不知道!

    【讨论】:

    • 谢谢,我刚接触 Haskell,我认为做一些简单的事情会帮助我学习,而且很明显它很有效......
    猜你喜欢
    • 1970-01-01
    • 2020-02-19
    • 2021-03-24
    • 2014-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-10-18
    相关资源
    最近更新 更多