gpt4 book ai didi

haskell - 当参数的类型不是静态的时,如何分解 Haskell 语句?

转载 作者:行者123 更新时间:2023-12-04 23:38:57 24 4
gpt4 key购买 nike

这有点难以解释,但我遇到过几次这种情况。

代码如下:

work :: String -> IO ()
work a = do
input <- lines <$> getContents
sortF <- let f = flip sortByM input
in case a of
"name" -> f (return . id :: FilePath -> IO FilePath)
"time" -> f (getModificationTime :: FilePath -> IO UTCTime)
_ -> f (getModificationTime :: FilePath -> IO UTCTime)
print sortF

sortByM :: (Monad m, Ord a) => (b-> m a) -> [b] -> m [b]
sortByM f x = do
x' <- mapM f x
return $ fst <$> (sortBy (comparing snd) $ zip x x')

以上抛出错误:
• Couldn't match type ‘UTCTime’ with ‘[Char]’
Expected type: String -> IO FilePath
Actual type: FilePath -> IO UTCTime
• In the first argument of ‘f’, namely
‘(getModificationTime :: FilePath -> IO UTCTime)’
In the expression:
f (getModificationTime :: FilePath -> IO UTCTime)
In a case alternative:
"time" -> f (getModificationTime :: FilePath -> IO UTCTime)

这是有道理的,但有没有办法以某种方式实现上述目标?否则我必须执行以下操作,这感觉不太容易维护:
work :: String -> IO ()
work a = do
input <- lines <$> getContents
sortF <- case a of
"name" -> flip sortByM input (return . id :: FilePath -> IO FilePath)
"time" -> flip sortByM input (getModificationTime :: FilePath -> IO UTCTime)
_ -> flip sortByM input (getModificationTime :: FilePath -> IO UTCTime)
print sortF

sortByM :: (Monad m, Ord a) => (b-> m a) -> [b] -> m [b]
sortByM f x = do
x' <- mapM f x
return $ fst <$> (sortBy (comparing snd) $ zip x x')

最佳答案

您遇到了 Dreaded Monomorphism Restriction .由于优化和代码生成方面的问题,当 GHC 看到一个没有显式参数的值时,它会为其推断出单态类型,而不是您期望的更通用的多态类型。

您可以使用 NoMonomorphismRestriction 禁用限制。 pragma,或者你可以给 f显式参数:

sortF <- let f xs = sortByM xs input in ...

关于haskell - 当参数的类型不是静态的时,如何分解 Haskell 语句?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44099021/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com