Haskell:使用函数值

卡德贝

我正在编写我的第一个Haskell程序,但在使函数使用用户输入的输入值方面遇到困难。我对该语言还不够了解,所以我以创建一个读取用户输入值并将其作为整数返回的函数作为开始。然后,在主调用函数中,我想将此值用作另一个函数的输入。这是代码方案:

module Main where

square :: Int -> Int
square n = n*n  

getInt :: IO Integer
getInt = do
    putStrLn "Enter a positive integer: "
    s <- getLine
    putStrLn("The number you entered is " ++ s)
    let num = read s :: Integer
    return num

main :: IO ()
main = do 
    num <- getInt
    print num -- works
    print $ square (getInt) -- breaks down here
    print $ square (num) -- also does not work
    print $ square (5) -- works
Bartek Banachewicz

Int之间不匹配Integer

让我们在这里看一下签名:

square :: Int -> Int
getInt :: IO Integer

很明显,这Int不是一个Integer,因此选择或使用Num n => n

square :: Num n => n -> n
getInt :: Num n => IO n

Int之间不匹配IO Int

第二个问题要复杂一些。由于getInt是IO操作,因此需要先提取它才能使用:

num <- getInt
print $ square num

还有其他方法可以通过IO操作构成纯函数:

-- Control.Applicative (<$>)
square <$> getInt >>= print

-- Data.Functor (fmap)
fmap square getInt >>= print

-- directly composed with return
getInt >>= return . square >>= print

-- manual lambda extraction
getInt >>= (\x -> return $ square x) >>= print

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

R中函数调用的参数值的haskell样式模式匹配

来自分类Dev

在Haskell中优雅地定义许多函数值

来自分类Dev

在函数内部使用Haskell函数

来自分类Dev

使用函数值访问python dict

来自分类Dev

使用FakeItEasy更改模拟的函数参数值?

来自分类Dev

将数值传递给使用dplyr的函数

来自分类Dev

使用Labmda函数计算无数值

来自分类Dev

使用函数值访问python dict

来自分类Dev

NumPy:使用ndarray对函数值求和

来自分类Dev

使用类属性限制函数参数值

来自分类Dev

如何使用ReactiveDict的构造函数值

来自分类Dev

haskell:使用高阶函数的阶乘

来自分类Dev

使用模板Haskell生成函数

来自分类Dev

使用Haskell创建高阶函数

来自分类Dev

使用Foldmap的Haskell平均函数

来自分类Dev

haskell:阶乘使用高阶函数

来自分类Dev

Haskell:如何使用案例函数

来自分类Dev

函数文字与函数值

来自分类Dev

有没有标准的Haskell函数进行数值裁剪?

来自分类Dev

如何从函数中返回整数值而无需在haskell中传递任何参数

来自分类Dev

如何使用JavaScript函数设置href参数值

来自分类Dev

如何使用libclang检索函数调用参数值

来自分类Dev

使用r中的循环函数计算每天的常数值?

来自分类Dev

使用多参数函数生成变量(参数值的排列)

来自分类Dev

如何使用datetime()函数值添加月份值

来自分类Dev

如何使用小书签从HTML页面获取函数参数值?

来自分类Dev

在keyup函数值上使用ng-class

来自分类Dev

使用指向函数的指针的数值积分总是返回 0

来自分类Dev

使用 lsqnonlin 绘制所有迭代期间的函数值演变