Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 隐式调用函数_Haskell_Implicit - Fatal编程技术网

Haskell 隐式调用函数

Haskell 隐式调用函数,haskell,implicit,Haskell,Implicit,我需要找到一种在Haskell中隐式调用函数的方法,就像在Scala中使用implicit函数一样 我研究过如何使用中所示的{-#LANGUAGE ImplicitParams#-},但如果不明确定义它,我就不知道如何实现类似的功能 这是我的代码的一个非常精简的版本 a :: Int -> Int a n = n + 1 b :: [Char] -> Int b cs = length cs 我想能跑 Test> a "how long" -- outputs 8, as

我需要找到一种在Haskell中隐式调用函数的方法,就像在Scala中使用
implicit
函数一样

我研究过如何使用中所示的
{-#LANGUAGE ImplicitParams#-}
,但如果不明确定义它,我就不知道如何实现类似的功能

这是我的代码的一个非常精简的版本

a :: Int -> Int
a n = n + 1

b :: [Char] -> Int
b cs = length cs
我想能跑

Test> a "how long" -- outputs 8, as it implicitly calls a (b "how long")
以及

Test> a 5 -- outputs 6
你在这里描述的是。在哈斯克尔,这是通过

例如,我们可以定义一个类:

class Foo c where
    a :: c -> Int
现在我们可以定义
Foo
的两个实例:一个是
Int
的实例,另一个是
String
的实例:

{-# LANGUAGE FlexibleInstances #-}

instance Foo [Char] where
    a = length

instance Foo Int where
    a = (+) 1

我不是haskeller,但您似乎在寻找单个调度,基于参数类型的调度?您可以为Strings创建实例您可以通过定义typeclass来实现这一点,然后为
String
Int
创建实例。是否有任何扩展方法,以便您可以忽略函数并自动转换,例如
value::Int\n value=“多长时间”
它会调用length而不显式写入它吗?@w1220不,一般不会。对于
String
,特别是(
OverloadedStrings
扩展名)有一些东西,但我强烈建议您不要为此使用它。学习在Haskell代码中编写Haskell,而不是Scala。
Prelude> a "how long"
8
Prelude> a (5 :: Int)
6