Cli*_*ton 7 haskell type-inference ghc
让我们说我们有一个像f这样的函数,返回一个monad.但是,你看Int
,假装它是一个非常复杂的类型.
f :: (Monad m) => m Int -- Pretend this isn't Int but something complicated
f = return 42
Run Code Online (Sandbox Code Playgroud)
现在让我们说我们想强迫它进入Maybe
monad.我们不需要编写完整类型f
来执行此操作,我们可以执行以下操作:
g :: Maybe a -> Maybe a
g = id
main = print $ (g f)
Run Code Online (Sandbox Code Playgroud)
虚拟函数g
强制f
成为Maybe
.
我认为上面的内容相当混乱.我宁愿写的是这样的:
main = print $ (f :: Maybe a)
Run Code Online (Sandbox Code Playgroud)
但它失败并出现以下错误:
Couldn't match expected type `a' against inferred type `Int'
`a' is a rigid type variable bound by
the polymorphic type `forall a. Maybe a' at prog.hs:7:16
Expected type: Maybe a
Inferred type: Maybe Int
In the second argument of `($)', namely `(f :: Maybe a)'
In the expression: print $ (f :: Maybe a)
Run Code Online (Sandbox Code Playgroud)
有没有办法以g
一种不那么混乱的方式做上面的事情,而不涉及创建一个新的功能?我不想写f :: Maybe Int
,因为如果返回类型改变它会成为一个维护问题.GHC扩展在答案中是可以的.
ham*_*mar 10
使用asTypeOf
.它返回第一个参数,同时将其类型与第二个参数统一.它只是一个类型限制版本const
,但对于这种情况很有用.
main = print $ f `asTypeOf` (undefined :: Maybe a)
Run Code Online (Sandbox Code Playgroud)
另一种方法是限制以下类型print
:
main = (print :: Show a => Maybe a -> IO ()) f
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
325 次 |
最近记录: |