也许从带有字符串的findIndex到Int到Int

时间:2015-10-26 15:34:44

标签: haskell

我刚开始使用Haskell并且必须解决以下任务。

我有一个包含工作日的列表,如果在列表中找到,我需要与值st的位置对应的索引:

weekdays = ["Montag","Dienstag","Mittwoch","Donnerstag","Freitag","Samstag","Sonntag"]

findIndex(==st)weekdays

到目前为止,我的代码工作正常,我得到了Just 3。但是,我读到,这是一个Maybe Int,我只需要它中的数字。

所以,我添加了一个函数eliminate

eliminate :: Maybe Int -> Int
eliminate (Just a) = a

但是,如果我使用eliminate findIndex(==st)weekdays它不起作用,错误是:

*** Expression     : eliminate findIndex (flip (==) st) weekdays
*** Term           : eliminate
*** Type           : Maybe Int -> Int
*** Does not match : a -> b -> c -> d

我无法找到离开这里的方法,因为我是初学者。

有人可以帮帮我吗?不幸的是,代码必须在Hugs98上运行。

1 个答案:

答案 0 :(得分:2)

请注意,Hugs报告的类型错误与函数应用程序的关联性和优先级有关。你的表达

eliminate findIndex (== st) weekdays

首先尝试将eliminate应用于findIndex,这不是您的代码的意图。我想你真正想做的是:

eliminate (findIndex (== st) weekdays)

eliminate $ findIndex (== st) weekdays

这些都将eliminate应用于findIndex (== st) weekdays的结果。这应按预期进行类型检查。

但是,在回答有关如何处理Maybe值的问题时:您可以使用fromJustfromMaybe来提取所包含的值。

链接转到当前的GHC文档,但应该有相同的Hugs函数。

以下是未来使用的提示:您可以使用Hoogle在线搜索Haskell文档。最好的是您可以按功能名称和类型签名进行搜索。例如,按Maybe a -> a搜索会发现这两种功能。

另一种方法是在Nothing以及Just a上进行模式匹配:

eliminate (Just a) = -- Handle a
eliminate Nothing = -- Handle error case

当然,在错误情况下,你必须决定eliminate应评估的内容。