簡體   English   中英

如果 typeOf f == io 那么 f 否則返回。 f 在 Haskell 中?

[英]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

根據我之前問答的代碼:

https://stackoverflow.com/a/71020780/17053359

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM