首页 > 解决方案 > 在 main = do haskell 中调用函数

问题描述

**大家好,haskell 的新手,我想知道当我尝试在 main 中调用 play_game 函数时,究竟什么会解决这个错误。忽略守卫的下半部分,因为我只是用随机值与他们混在一起试图解决问题。

哈斯克尔代码在这里

** 1https ://i.stack.imgur.com/AS4IN.png

{-# LANGUAGE ScopedTypeVariables #-}

标签: haskellfunctional-programming

解决方案


  1. 您在 readLn 上的语法是错误的 - 正确的是:something <- readLn :: IO Int

  2. 您的主要功能是 IO GHC.Types.Any 类型,简而言之:IO a 但您的功能 play_games 返回类型为 (Num a) => a 的东西。do 表示法的最后一个语句必须始终是返回类型......(请记住:do 表示法只是用于 (<*>) 的语法 shugar

例如:

main = do
   a <- fs
   b <- as
   pure (f a)

类似于:

fs <*> as

所以在你的例子中,一个糟糕的解决方案是:

main :: IO Int
main = do
    putStrLn "Please input total number of games."
    numGames <- readLn :: IO Int
    player1 <- readLn :: IO Int
    player2 <- readLn :: IO Int
    print player1
    print player2
    return $ play_games player1 player2 numGames (0,0)

play_games :: (Eq a1, Eq a2, Num a1, Num a2, Num a3) => a1 -> a2 -> p -> (a4, a3) -> a3
play_games player1 player2 numGames score
    | player1 == 0&& player2 == 1 = snd score + 1

推荐阅读