7

以下のfのような、モナドを返す関数があるとしましょう。しかし、あなたが見るところではInt、それが本当に複雑なタイプであるふりをしてください。

f :: (Monad m) => m Int -- Pretend this isn't Int but something complicated
f = return 42

Maybeこれをモナドに強制したいとしましょう。これを行うために完全なタイプを記述する必要はありませんf。次のことを行うことができます。

g :: Maybe a -> Maybe a
g = id

main = print $ (g f)

ダミー関数gは強制的に。fになりMaybeます。

上記はかなり厄介だと思います。私が書きたいのはこれです:

main = print $ (f :: Maybe a)

ただし、次のエラーで失敗します。

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)

g新しい関数の作成を伴わない、より面倒な方法で上記のことを行う方法はありますか?f :: Maybe Int返品タイプが変わるとメンテナンスの問題になりますので、書きたくありません。GHC拡張機能は答えに問題がありません。

4

2 に答える 2

10

を使用しasTypeOfます。その型を2番目の型と統合しながら、最初の引数を返します。のタイプ制限バージョンですがconst、このような状況で役立ちます。

main = print $ f `asTypeOf` (undefined :: Maybe a)
于 2012-08-01T01:38:19.160 に答える
8

さらに別の方法は、次のタイプを制限することですprint

main = (print :: Show a => Maybe a -> IO ()) f

更新:
GHC 8.0.1では、強制に使用できるTypeApplicationsMaybe拡張機能が導入されました。

{-# LANGUAGE TypeApplications #-}

main = print $ f @Maybe
于 2012-08-01T05:40:06.587 に答える