相關
https://stackoverflow.com/a/71020780/17053359
我們可以將非IO函式 :提升f為IO帶有return,的函式
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
Haskell 中的代碼是什么?
編輯:
console.log(
Object(1)
);
console.log(
Object(Object(1))
);
console.log(
Object(Object(Object(1)))
);
uj5u.com熱心網友回復:
你幾乎肯定不想這樣做。為此所需的型別級別的黑客數量應該已經把你嚇跑了,這真的不是 Monads 應該被使用的方式。
純粹出于教育目的,這就是定義函式的方式pureish,它的行為就像return引數不是type時IO a一樣,就像id引數是type 時一樣IO a。
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
別說我沒警告過你!
uj5u.com熱心網友回復:
這是Prophet 答案的另一個版本,沒有重疊的實體。
{-# 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)
uj5u.com熱心網友回復:
本人回答。
我完全不知道我的問題有什么問題,也許我的提問方式還不夠。至少,我已經提到冪等性和我的示例代碼片段 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
根據我之前的問答代碼:
https://stackoverflow.com/a/71020780/17053359
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/427281.html
標籤:哈斯克尔
上一篇:如何在Haskell中分離陣列
