我刚开始使用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上运行。
答案 0 :(得分:2)
请注意,Hugs报告的类型错误与函数应用程序的关联性和优先级有关。你的表达
eliminate findIndex (== st) weekdays
首先尝试将eliminate
应用于findIndex
,这不是您的代码的意图。我想你真正想做的是:
eliminate (findIndex (== st) weekdays)
或
eliminate $ findIndex (== st) weekdays
这些都将eliminate
应用于findIndex (== st) weekdays
的结果。这应按预期进行类型检查。
但是,在回答有关如何处理Maybe
值的问题时:您可以使用fromJust
或fromMaybe
来提取所包含的值。
链接转到当前的GHC文档,但应该有相同的Hugs函数。
以下是未来使用的提示:您可以使用Hoogle在线搜索Haskell文档。最好的是您可以按功能名称和类型签名进行搜索。例如,按Maybe a -> a
搜索会发现这两种功能。
另一种方法是在Nothing
以及Just a
上进行模式匹配:
eliminate (Just a) = -- Handle a
eliminate Nothing = -- Handle error case
当然,在错误情况下,你必须决定eliminate
应评估的内容。