[英]if typeOf f == io then f else return . f in Haskell?
相關
https://stackoverflow.com/a/71020780/17053359
我們可以用return
將非IO
函數: f
提升到IO
,如
return . f
現在,我想讓這個f
通用,包括IO
f :: A -> IO A -- not IO to IO
f :: IO a -> IO a -- (no change, `id` instead of `return`)
換句話說:
如果 typeOf f
== io
那么f
否則return. f
return. f
Haskell 中的代碼是什么?
編輯:
console.log( Object(1) ); console.log( Object(Object(1)) ); console.log( Object(Object(Object(1))) );
你幾乎肯定不想這樣做。 為此所需的類型級別黑客數量應該已經把你嚇跑了,這真的不是應該使用 Monad 的方式。
純粹出於教育目的,這就是你如何定義一個 function pureish
,如果參數不是 IO a 類型,它的行為就像return
一樣,如果參數是IO a
IO a
,它就像id
一樣。
type family PureishResult a where
PureishResult (IO a) = a
PureishResult a = a
class Pureish p where
pureish :: p -> IO (PureishResult p)
instance {-# OVERLAPPABLE #-} (PureishResult a ~ a) => Pureish a where
pureish = pure
instance Pureish (IO a) where
pureish = id
別說我沒提醒你!
這是Prophet's answer的另一個版本,沒有重疊的實例。
{-# language MultiParamTypeClasses, DataKinds, KindSignatures, TypeFamilies, TypeApplications, ScopedTypeVariables, AllowAmbiguousTypes, FlexibleInstances, FlexibleContexts #-}
type family GetUnderlying a where
GetUnderlying (IO a) = a
GetUnderlying a = a
type family IsIO a where
IsIO (IO _) = True
IsIO _ = False
class Pureish (isIO :: Bool) u a where
pureish' :: a -> IO u
instance Pureish False u u where
pureish' = pure
instance Pureish True u (IO u) where
pureish' = id
pureish :: forall a u. (Pureish (IsIO a) u a, u ~ GetUnderlying a) => a -> IO u
pureish = pureish' @(IsIO a)
由我自己回答。
我完全不知道我的問題有什么問題,也許我的提問方式還不夠。 至少,我已經提到了冪等性和我的示例代碼片段 JS。 但這是我的簡單解決方案。
(+++) :: (a -> b) -> (b -> c) -> a -> c
(+++) = flip (.)
infixl 9 +++
someFunctor :: Show a => (a -> IO b) -> IO (R a) -> IO (R b)
someFunctor = \f -> \ioA -> do
print "-- someFunctor"
val <- ioA >>= _val
b <- (f +++ return +++ join) val
io b
根據我之前問答的代碼:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.