gpt4 book ai didi

haskell - 能够从 Haskell 中的 monadic action 中获得多态函数

转载 作者:行者123 更新时间:2023-12-01 07:06:42 25 4
gpt4 key购买 nike

我希望能够编写一个 IO 操作,它会返回一个多态函数,该函数可以用于不同的值,但似乎我不能。任何人都可以帮我做吗?

f :: a -> Bool
f _ = True

getF :: Int -> (a -> Bool)
getF _ = f

getFIO :: IO (a -> Bool)
getFIO = return f

main :: IO ()
main = do
-- this works
print ((f :: Int -> Bool) (10::Int))
print ((f :: String -> Bool) "asd")

-- this works
let f' = getF 10
print (f' (10::Int))
print (f' "asd")

-- this doesn't
f'' <- getFIO
print (f'' (10::Int))
print (f'' "asd")

-- but this does
f''' <- getFIO
print (f''' (10::Int))
f'''' <- getFIO
print (f'''' "asd")

return ()

最佳答案

除了 ->,Haskell 不允许你对类型构造函数使用多态参数。 .您需要使用 newtype以利用该特别豁免。

{-# LANGUAGE RankNTypes #-}
newtype ToBool = ToBool {getToBool :: forall a . a -> Bool}

f :: ToBool
f = ToBool (const True)

getFIO :: IO ToBool
getFIO = return f

您需要申请 getToBool每次想用 f ,不过没关系。

关于haskell - 能够从 Haskell 中的 monadic action 中获得多态函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33220139/

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