当前位置:  开发笔记 > 编程语言 > 正文

Haskell也许类型 - >类型

如何解决《Haskell也许类型->类型》经验,为你挑选了2个好方法。

我遇到了这个问题:

Couldn't match expected type ‘Int’ with actual type ‘Maybe Int’

我可以以某种方式将'Maybe Int'转换为'Int'吗?

if index == Nothing 
   then 
     do 
       let index = 0
       putStrLn(fancyPrint2 $ kaasasOlevList !! index)
   else 
     do 
       let index = index
       putStrLn(fancyPrint2 $ kaasasOlevList !! index)

我试过这样,但这给了我:

Exception: <>

Willem Van O.. 5

是的,你可以使用这个fromMaybe功能:

fromMaybe :: a -> Maybe a -> a

其工作原理如下,第一个参数是默认值,你的情况下,第二个是使用的东西Nothing,旁边跟随Maybe a,如果该值Just x,x则返回.所以实现fromMaybe可能是:

fromMaybe _ (Just x) = x
fromMaybe d Nothing = d

所以你可以使用:

import Data.Maybe(fromMaybe)

--...

putStrLn(fancyPrint2 $ kaasasOlevList !! (fromMaybe 0 index))

没有所有这些if-then-else都是非Haskell.


为什么循环?好吧,如果你index的形式Just x,它进入以下分支:

do 
   let index = index
   putStrLn(fancyPrint2 $ kaasasOlevList !! index)

现在表达式:

   let index = index

意味着你分配index 给自己(而不是外部index).这在函数式编程语言中并不是一个问题,尽管如果你想使用这样的函数会出现问题.



1> Willem Van O..:

是的,你可以使用这个fromMaybe功能:

fromMaybe :: a -> Maybe a -> a

其工作原理如下,第一个参数是默认值,你的情况下,第二个是使用的东西Nothing,旁边跟随Maybe a,如果该值Just x,x则返回.所以实现fromMaybe可能是:

fromMaybe _ (Just x) = x
fromMaybe d Nothing = d

所以你可以使用:

import Data.Maybe(fromMaybe)

--...

putStrLn(fancyPrint2 $ kaasasOlevList !! (fromMaybe 0 index))

没有所有这些if-then-else都是非Haskell.


为什么循环?好吧,如果你index的形式Just x,它进入以下分支:

do 
   let index = index
   putStrLn(fancyPrint2 $ kaasasOlevList !! index)

现在表达式:

   let index = index

意味着你分配index 给自己(而不是外部index).这在函数式编程语言中并不是一个问题,尽管如果你想使用这样的函数会出现问题.



2> Electric Cof..:

你有几种不同的选择来解决这个问题

首先是使用你的if声明,但稍作修改(尽管避免这样做)

if index == Nothing 
   then 
     do 
       let index' = 0
       putStrLn $ fancyPrint2 $ kaasasOlevList !! index'
   else 
     do 
       let (Just index') = index
       putStrLn $ fancyPrint2 $ kaasasOlevList !! index'

我在index'这里写,因为Haskell不允许你覆盖现有的变量,但它确实让你隐藏它们.但一般来说,更好的做法是'在末尾用"prime"符号()标记变量的"修改"版本.这样,如果需要,您可以随时访问原始文件.

其次,您可以使用case将代码转换为的表达式

case index of
  Just i  -> putStrLn $ fancyPrint2 $ kaasasOlevList !! i
  Nothing -> putStrLn $ fancyPrint2 $ kaasasOlevList !! 0

或者如果你使用一个where子句清理一下:

case index of
  Just i  -> putIndex i
  Nothing -> putIndex 0
where putIndex x = putStrLn $ fancyPrint2 $ kaasasOlevList !! x

最后,fromMaybe这可以让你这样做:

import Data.Maybe (fromMaybe)

-- ...

do
  let index' = fromMaybe 0 index
  putStrLn $ fancyPrint2 $ kaasasOlevList !! index'

你也可以使用警卫.但由于我不知道你的代码片段来自何处,我不知道使用警卫是否合理.

您可以在此处阅读有关警卫,案例表达和模式匹配的更多信息


我建议不要使用`if`,除非它是非常必要的.不是你在*monadic*环境中这样做,这意味着你强制执行计算顺序,这违反了Haskell的惰性编程原则.
推荐阅读
家具销售_903
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有