2014-12-18 28 views
6

Aşağıdaki işlevi aldığımı varsayalım: Haskell: Bir fonksiyonun dönüş tipini fonksiyonun içinden çıkarmanın bir yolu var mı?

import Data.Typeable 
import Text.Read (reads) 

parse :: (Read b, Typeable b) => String -> IO b 
parse msg = case reads msg of 
     [(value,"")] -> return value 
     _ -> throwIO $ ErrorCall ("could not parse " ++ msg) 

İstediğim her şeyi bir String’i ayrıştırır. Dize hatalı biçimlendirilmişse, bu iletiyi ayrıştıramayan bir istisna atar. Bu işlevi IO-Monad'ın yaptığı gibi bir blokta kullanırım.

(a,b) <- parse msg :: IO (Int,Int) 

benzeri ve

s <- parse msg :: IO String 

gibi başka yerde IO-Monad bir do bloğunda bu işlevi kullanın Bu yazıyı okuyan bir şey nasıl alabilirim, b türü var mı?

Geçici bir bu

import Data.Typeable 
import Text.Read (reads) 

parse :: (Read b, Typeable b) => b -> String -> IO b 
parse dummy msg = case reads msg of 
     [(value,"")] -> return value 
     _ -> throwIO $ ErrorCall ("could not parse " ++ msg ++ " as " ++ 
         show (typeOf dummy)) 

yapıyor ve

s <- parse "" msg :: IO String 

gibi çağırma Ama bu oldukça saçma görünüyor olacaktır.

İşlevsel işlevden bir işlevin dönüş türünü çıkarmanın bir yolu var mı?

+0

Ayrıca: İstendiğinde belirli bir tür * değerlerini * döndürmek isterseniz ve işlenmemiş bir dönüş türü istendiğinde bir hata varsa ne olur? – Evi1M4chine

cevap

12

Kukla değişkeni kullanmanıza gerek yok, ScopedTypeVariables uzantısını kullanabilirsiniz.

{-# LANGUAGE ScopedTypeVariables #-} 

parse :: forall b. (Read b, Typeable b) => String -> IO b 
parse msg = case reads msg of 
    [(value,"")] -> return value 
    _ -> error $ "could not parse " ++ msg ++ " as " ++ 
        show (typeOf (undefined :: b)) 
+6

Bu günlerde, havalı çocukların bu tür şeyler için “undefined” yerine “Proxy” yi kullandıkları görünüyor. – dfeuer

+0

@dfeuer Evet, bu doğru. Proxy'nin şu anda 'base' olduğunda' undefined 'kullanmak utanç vericidir. –

+3

Evet, modern yöntem şudur (showRep (Proxy :: Proxy b)) '. – augustss

İlgili konular